C if 语句将两个整数变量与同一个常量进行比较

C if statement comparing two integer variables to the same constant

我正在尝试将两个整数变量与同一个常量进行比较。显然在这种情况下,两个变量具有相同的默认值。我试图像这样简化比较语句:

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

没用。

我不得不这样编码:

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

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

po->app_tag == po->inst_id == 0 将被解释为 (po->app_tag == po->inst_id) == 0 - 也就是说,与 0 进行比较的不是单独的两个变量,而是 [=13 的结果=].如果两个值相等,则该操作将 return a 1,如果不相等,则 0。那么实际上,po->app_tag == po->inst_id == 0 等同于 po->app_tag != po->inst_id,这不是您想要的。

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

由于 == 运算符的结合性(从左到右结合),

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