警告:逗号的左手操作数无效(c)

时间:2014-10-08 21:08:04

标签: c

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

我只是在用户输入'a'或'A'时尝试继续。每当我构建它时,它都会警告“逗号的左手操作数没有效果”。

我对C很新,所以如果我不够具体或遗漏了一些明显的东西,我会道歉。

4 个答案:

答案 0 :(得分:4)

这不是怎么做的,你应该这样做

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

答案 1 :(得分:4)

将条件更改为

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

至于你的原始表达

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

然后使用逗号运算符,表达式的值为' A'。作为' A'不等于零,那么条件总是等于真。逗号前的表达式将被丢弃。

答案 2 :(得分:1)

虽然目前的答案都是正确的,但我认为这可能更为惯用:

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

答案 3 :(得分:0)

if (class == 'a','A')中,左半部分是比较class == 'a',可以评估为truefalse(在布尔意义上的¹) 。 右半部分仅为'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");

并运行它(在强制编译器编译之后)确实会显示“false”行。

编译器抱怨,因为左半部分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,我只在{em> boolean 意义上使用truefalse,因为C默认情况下没有包含{{1}的这些命名值的概念(这通过名称定义常量)。但是,基本概念是相同的:stdbool.h语句计算其参数,如果它的计算结果为if,则会被视为false(因此不会执行以下表达式),{{ 1}}如果它的评估范围不是0