2016-10-03 97 views
0

我想比较两个整数变量的同一个常量。显然在这种情况下,两个变量都具有相同的默认值。我试图简化比较说明是这样的:C if语句比较两个整数变量的相同常数

if (po->app_tag == po->inst_id == 0) 
    return 1; 

它没有工作。

我不得不代码它喜欢:

if ((po->app_tag == 0) && (po->inst_id == 0)) 
    return 1; 

要使它发挥作用。任何人都可以向我解释两者之间的区别吗?不知怎的,我觉得C编译器在比较两个整型变量时应该有这种语法的规定。我可能错了,要求.. :),但想了解一个原因..我为什么在这里错了。

+1

你知道表达式'a == b'可以返回哪些值吗? –

+0

当您将一个变量与另一个比较的结果进行比较时,您将它与0或1比较,这可能不是您想要的:http://stackoverflow.com/questions/18097922/return-value-of- operator-in-c –

+0

@EugeneSh。是的..犯了一个基本的错误... –

回答

3

由于==操作(从左边关联到右)的相关性,

po->app_tag == po->inst_id == 0 

被解释为:

(po->app_tag == po->inst_id) == 0 

这就是语言是如何定义的。

使用

(po->app_tag == 0) && (po->inst_id == 0) 

修复该问题通过独立地评估po->app_tag == 0po->inst_id == 0以及执行布尔AND这两个之间。

有关运算符优先级和关联性的更多信息,请参阅http://en.cppreference.com/w/c/language/operator_precedence

+0

感谢您的详细解释..! –

1

po->app_tag == po->inst_id == 0将被解释为(po->app_tag == po->inst_id) == 0 - 也就是说,被比较0的东西不是两个变量分别,但po->app_tag == po->inst_id结果。如果两个值相等,该操作将返回1,如果不相等,则返回0。实际上,那么,po->app_tag == po->inst_id == 0相当于po->app_tag != po->inst_id,这不是你想要的。

+0

感谢您的详细解释..! –

0

这是C/C++编译器的工作方式。比较表达式只能比较两个变量。如果您需要更多,则需要使用逻辑AND(&&)或OR(||)表达式。如果你想比较一个变量和多于两个const值,你可以使用switch语句。