if (class == 'a','A')
我试图只在用户输入'a'或'A'时才继续。每次构建它时,都会警告“逗号的左侧操作数没有任何影响”。警告:逗号左手操作数无效(c)
我对C非常陌生,所以我很抱歉,如果我不够具体或缺少明显的东西。
if (class == 'a','A')
我试图只在用户输入'a'或'A'时才继续。每次构建它时,都会警告“逗号的左侧操作数没有任何影响”。警告:逗号左手操作数无效(c)
我对C非常陌生,所以我很抱歉,如果我不够具体或缺少明显的东西。
,这不是如何做到这一点,你应该做的,而不是
if(class == 'a' || class == 'A')
非常感谢!你知道它为什么以其他方式工作,即使它错了吗? – Jeremy 2014-10-08 21:10:44
@Jeremy:它没有*工作*,但它确实编译。 ','是*逗号运算符*。请查阅您的C语言教科书,以了解这意味着什么。这个:'(class =='a','A')'相当于:'((class =='a'),'A')'。 – 2014-10-08 21:14:23
更改条件
if (class == 'a' || class == 'A')
至于你的原始表达式
if (class == 'a','A')
则使用逗号运算符,表达式的值为'A'。由于'A'不等于零,因此条件将始终等于真。放弃逗号前的表达式。
虽然双方目前的答案是正确的,我认为这可能是更地道的事:
#include <ctype.h>
...
if (tolower(class) == 'a')
{
...
}
在if (class == 'a','A')
中,左半是比较class == 'a'
并且可以评估要么true
或false
(以布尔意义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'
“什么都不做”:它对class
或if
语句的结果没有副作用。因此,编译器会假定这是一个错误,因此会发出警告。这是一个警告,而不是一个错误,因为语法是正确的。为了便于比较,你是允许写类似这样的东西作为
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,我用true
和false
仅在布尔感,为C在默认情况下不包括stdbool.h
没有这些命名值的概念(这个名字定义的常量)。但是,其基本概念是相同的:if
语句评估其参数,如果其计算结果为0
(因此将不执行下列表达式),则该参数被认为是false
; true
如果计算结果为除0
之外的任何值。
我强烈建议您阅读C书给初学者... – Jack 2014-10-08 21:10:29
另请参阅http://stackoverflow.com/questions/13209399/c-what-does-int-x-anyint1-anyint2-mean – usr2564301 2014-10-08 21:11:07
The [逗号运算符](http://en.wikipedia.org/wiki/Comma_operator)不会做你认为它的作用。 – sfstewman 2014-10-08 21:11:33