2014-10-08 41 views
-2
if (class == 'a','A') 

我试图只在用户输入'a'或'A'时才继续。每次构建它时,都会警告“逗号的左侧操作数没有任何影响”。警告:逗号左手操作数无效(c)

我对C非常陌生,所以我很抱歉,如果我不够具体或缺少明显的东西。

+5

我强烈建议您阅读C书给初学者... – Jack 2014-10-08 21:10:29

+0

另请参阅http://stackoverflow.com/questions/13209399/c-what-does-int-x-anyint1-anyint2-mean – usr2564301 2014-10-08 21:11:07

+0

The [逗号运算符](http://en.wikipedia.org/wiki/Comma_o​​perator)不会做你认为它的作用。 – sfstewman 2014-10-08 21:11:33

回答

4

,这不是如何做到这一点,你应该做的,而不是

if(class == 'a' || class == 'A') 
+0

非常感谢!你知道它为什么以其他方式工作,即使它错了吗? – Jeremy 2014-10-08 21:10:44

+3

@Jeremy:它没有*工作*,但它确实编译。 ','是*逗号运算符*。请查阅您的C语言教科书,以了解这意味着什么。这个:'(class =='a','A')'相当于:'((class =='a'),'A')'。 – 2014-10-08 21:14:23

4

更改条件

if (class == 'a' || class == 'A') 

至于你的原始表达式

if (class == 'a','A') 

则使用逗号运算符,表达式的值为'A'。由于'A'不等于零,因此条件将始终等于真。放弃逗号前的表达式。

1

虽然双方目前的答案是正确的,我认为这可能是更地道的事:

#include <ctype.h> 
... 
if (tolower(class) == 'a') 
{ 
    ... 
} 
0

if (class == 'a','A')中,左半是比较class == 'a'并且可以评估要么truefalse(以布尔意义1)。 右半部分只是'A',它不等于0,因此不等于true。左半部分被评估,但结果未被使用。然后评估右半部分,其“结果”为'A',即true。因此,代码行为,如果你写

if (true) 
    ... 

您可以通过使用一个“0”,在右半检查:

if (class == 'a', 0) 
    printf ("if-statement is true\n"); 
else 
    printf ("if-statement is false\n"); 

和运行这个(强迫编译器来编译后)确实会显示“虚假”的路线。

编译器抱怨,因为左半部分class == 'a'“什么都不做”:它对classif语句的结果没有副作用。因此,编译器会假定这是一个错误,因此会发出警告。这是一个警告,而不是一个错误,因为语法是正确的。为了便于比较,你允许写类似这样的东西作为

if (class = 'a', 'A') 
    printf ("class == a,A seems to be true\n"); 
else 
    printf ("That didn't work.\n"); 

有效的副作用(class将获取字符常量'a'值) - 但它也总是指出似乎是true,因为后半部分是传递给if声明的内容。


¹对于C,我用truefalse仅在布尔感,为C在默认情况下不包括stdbool.h没有这些命名值的概念(这个名字定义的常量)。但是,其基本概念是相同的:if语句评估其参数,如果其计算结果为0(因此将不执行下列表达式),则该参数被认为是false; true如果计算结果为除0之外的任何值。