我可能犯了一些语法错误,但我无法理解为什么我的代码无效:
在.m文件的顶部,我写道:
#define kCountry "Country";
在这种情况下,我收到来自xCode的红色警告 - 预期]
然后在函数体中:
floatCountries = 74,2;
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];
float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];
NSLog(@"%f", test);
在那一个 - 预期的表达。
这可能听起来有点愚蠢,但我想简化我的代码并使用它,请帮助我! :)
答案 0 :(得分:9)
从定义的末尾删除分号并添加'@':
#define kCountry @"Country"
答案 1 :(得分:5)
使用:
#define kCountry @"Country"
你最后加了一个分号。
因为这将替换为字符串值,您需要放置@
答案 2 :(得分:5)
解释为什么这不起作用:
#define kCountry "Country";
在这种情况下,我从xCode得到了红色警告 - 预期]
没有“红色警告”这样的事情。警告是黄色的;错误是红色的。
(除非你打开“将警告视为错误”;然后,从某种意义上说,所有警告都是红色的 - 因为它们是错误的。)
反正。
预处理程序指令(例如#define
)不需要分号。如果包含一个,它将成为指令的一部分。
预处理器将任何宏替换为您定义的宏。在这种情况下,您定义了名为“kCountry
”的宏,其值为“"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";];
分号不能进入声明;它必须来。因此,上述陈述无效。
修复方法是从你#define
宏的行中删除分号,这样分号就不会出现在输出中:
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"];
顺便说一句,Xcode在其跳转栏中有一个选项,可以显示完整的预处理代码版本,因为编译器会看到它。在调查宏观问题时,这可能很方便。
所以,这是其中一个问题。另一个是......
"Country"
是一个C字符串。它仅适用于C字符串和stdio库(包括函数printf
,strcat
等)以及需要C字符串的各种其他API(例如+[NSString stringWithUTF8String:]
和{{1} })。
NSUserDefaults,就像Cocoa中需要字符串的其他东西一样,需要一个Cocoa字符串对象 - 一个NSString。 NSString文字的语法是相同的,但前面有+[NSString stringWithCString:encoding:]
:@
。
因此有效的版本:
@"Country"
产生预处理输出:
#define kCountry @"Country"
在两个地方都没有语法错误和正确的字符串类型,这是可以使用的版本。
哦,正如Anoop Vaidya已经指出的那样:
您尝试为变量指定一个数字,但我认为您会找到与您预期不同的数字。
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:@"Country"]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:@"Country"];
如果使用如下语句打印此变量的值:
floatCountries = 74,2;
您会发现输出为NSLog(@"%f", floatCountries);
。
C有一个名为逗号运算符的运算符,它只是2.0
,其中x和y可以是任何表达式(理想情况下是彼此兼容的类型 - 例如,两个数字)。
逗号运算符首先计算左侧表达式,然后计算右侧表达式,并自行计算右侧表达式。
x, y
首先评估表达式74,2
,然后评估表达式74
,然后评估为2
。因此,您可以将2
(2
(根据需要自动转换)分配给变量。
将它与字面数字一起使用似乎有些愚蠢,而且确实如此。逗号运算符存在与具有副作用的表达式一起使用,例如涉及int
和++
运算符的表达式。
通常不鼓励使用逗号运算符,因为结果代码不清楚:通常,每行应该做一件事,但--
之类的行会做三事情
尽管如此,它仍然有效,正如您所发现的那样。但是,如果您打开了“未使用的值”警告(应该如此),您应该收到警告,因为表达式的一半实际上是未使用的 - 您将x = ++y, --z;
放在地板上。无害,但这不是你想要做的症状。
你想要的是:
74