1

我可能犯了一些语法错误,但我不明白为什么我的代码不起作用:

在 .m 文件的顶部,我写道:

#define kCountry "Country";

在这种情况下,我收到了来自 xCode 的红色警告 - 预期]

然后在函数体中:

 floatCountries = 74,2;
 [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];

  float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];
  NSLog(@"%f", test);

在那个 - 预期的表达。

这可能听起来有点愚蠢,但我想简化我的代码并使用它,请帮助我!:)

4

3 回答 3

9

从定义末尾删除分号并添加“@”:

#define kCountry @"Country"
于 2013-03-02T16:40:43.643 回答
5

利用:

#define kCountry @"Country"

您在末尾添加了一个分号。

由于这将被替换为字符串值,因此您需要输入@

于 2013-03-02T16:41:22.507 回答
5

解释为什么这不起作用:

分号

#define kCountry "Country";

在这种情况下,我收到了来自 xCode 的红色警告 - 预期]

没有所谓的“红色警告”。警告为黄色;错误为红色。

(除非您打开“将警告视为错误”;然后,从某种意义上说,所有警告都是红色的——因为它们是错误。)

反正。

诸如#define不需要分号的预处理器指令。如果您包含一个,它将成为指令的一部分。

预处理器将任何宏替换为您定义的任何宏。在这种情况下,您定义了一个名为“<code>kCountry”的宏,其值为“<code>"Country;”。请注意,分号是值的一部分——指令在行尾结束,而不是在分号。

因此,当您使用宏时:

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];

预处理器替换宏如下:

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country";];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country";];

分号不能放在语句中;它必须紧随其后。因此,上述陈述无效。

解决方法是从 d 宏的行中删除分号#define,以便分号不会出现在输出中:

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"];

顺便说一句,Xcode 在它的 Jump Bar 中有一个选项可以向您显示代码的完整预处理版本,因为编译器会看到它。这在调查宏观问题时会很方便。

所以,这是问题之一。另一个是……</p>

您使用的字符串类型

"Country"是一个 C 字符串。它仅适用于 C 字符串和 stdio 库(包括函数printfstrcat等)以及需要 C 字符串的各种其他 API(例如+[NSString stringWithUTF8String:]+[NSString stringWithCString:encoding:])。

NSUserDefaults,就像 Cocoa 中需要字符串的所有其他东西一样,需要一个 Cocoa 字符串对象——一个 NSString。NSString 字面量的语法是相同的,但@前面有一个:@"Country"

因此有效的版本:

#define kCountry @"Country"

产生预处理的输出:

[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:@"Country"];

float test= [[NSUserDefaults standardUserDefaults]floatForKey:@"Country"];

在这两个地方都没有语法错误和正确类型的字符串,这是可以工作的版本。

哦,而且,正如 Anoop Vaidya 已经指出的那样:

数字语法

您尝试为变量分配一个数字,但我认为您会在那里找到一个与您预期不同的数字。

floatCountries = 74,2;

如果您使用以下语句打印此变量的值:

NSLog(@"%f", floatCountries);

你会发现输出是2.0.

C 有一个称为逗号运算符的运算符,它很简单x, y,其中 x 和 y 可以是任何表达式(理想情况下是相互兼容的类型——例如,两个数字)。

逗号运算符首先计算左边的表达式,然后计算右边的表达式,然后它自己计算右边的表达式。

74,2首先计算表达式74,然后计算表达式2,然后计算为2。因此,您将2(an int,根据需要自动转换) 分配给变量。

将其与文字数字一起使用似乎有点愚蠢,但确实如此。逗号运算符的存在是为了与具有副作用的表达式一起使用,例如涉及++and--运算符的表达式。

通常不鼓励使用逗号运算符,因为生成的代码不清楚:通常,每一行应该做一件事,但一行如x = ++y, --z;件事。

尽管如此,正如您发现的那样,它是有效的。但是,如果您打开了“未使用值”警告(您应该这样做),您应该会收到一个警告,因为实际上一半的表达式是未使用的——您将其丢74在地板上。无害,但表明这不是您的本意。

你想要的是:

floatCountries = 74.2;
于 2013-03-03T07:34:33.870 回答