【问题标题】:Unexpected output in C program [duplicate]C程序中的意外输出[重复]
【发布时间】:2017-10-07 17:59:39
【问题描述】:

我运行以下 C 程序

#include <stdio.h>

int main() {
    int x = 5, y = 6, z = 3, i;
    i = y > x > z;
    printf("%d\n", i);
}

并获得0 的输出。 同样,当我跑步时

 #include <stdio.h>

 int main() {
     int x = 5, y = 6, z = 3, i;
     i = y > x && x > z;
     printf("%d\n", i);
 }

我的输出为1。谁能解释一下这背后的逻辑?

【问题讨论】:

  • 6 &gt; 5 == 1-> 1 &gt; 3 == 0
  • 如果您了解这些运算符的工作原理,那应该是不言自明的。这里唯一可能有点微妙的是运算符关联性,其中关系运算符保证从左到右。即保证表达式等价于(y &gt; x) &gt; z

标签: c relational-operators


【解决方案1】:

关系运算符与left to right 关联。因此i = y &gt; x &gt; z; 将被解析为

i = ( (y > x) > z ) => ( (6 > 5) > 3 ) => ( 1 > 3 ) => 0

i = y &gt; x &amp;&amp; x &gt; z; 将被解析为

i = (y > x) && (x > z) => (6 > 5) && (5 > 3) => 1 && 1 => 1 

也就是说,在 C 语言中,y &gt; x &gt; z 不会检查 x 是否大于 z 且小于 y。但是y &gt; x &amp;&amp; x &gt; z 可以。


请注意,关系运算符返回01,具体取决于操作数之间的关系是false 还是true

【讨论】:

  • 我只是想发布同样的东西。我打字太慢了
  • 可以通过以下方式改进答案:提到&gt; 的运算符关联性是从左到右的。还要提及/链接运算符优先级/关联性表,以便 OP 可以学习如何为其他运算符找到相同的信息。
【解决方案2】:
i = y > x > z;

在第一个示例中,&gt; 运算符的关联性从左到右,因此,首先解析 y &gt; x 并给出布尔结果。

y > x = 6 > 5 = True

那么,

1(True) > 3 = False

所以,输出0

其次,

i = y > x && x > z;

&gt; 运算符 更高优先级 然后 &amp;&amp; 运算符。所以,先解析y &gt; x,如果条件True,再检查x &gt; z

【讨论】:

  • Nit-pick:运算符优先级和关联性决定了表达式解析的顺序,而不是求值的顺序。评估顺序未指定。也就是说,给定y() &gt; x() &gt; z(),您无法知道函数的执行顺序。仅将 y() 和 x() 的结果与 &gt; 一起使用,然后将其结果与 z() 的结果进行比较。
  • @Lundin 谢谢!!,我已经编辑了我的答案。
猜你喜欢
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2015-12-02
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
相关资源
最近更新 更多