【问题标题】:a>b>c Evaluation When Each Has Numeric Values [duplicate]a>b>c 当每个都有数值时的评估[重复]
【发布时间】:2014-10-09 09:48:04
【问题描述】:

我遇到了一个竞争性的 C 问题,内容如下:

查找输出:

#include <stdio.h>
int main(void) {
    int a=5, b=10, c=5;
    int x;
    x = a>b>c;
    printf("%d\n", x);
    return 0;
}

编译器响应 0。

我的解释是,这可能是从右到左评估的副作用。我的猜测是,首先对b&gt;c 进行评估(假设它首先被推入堆栈,我在这里很困惑,因为我知道> 的从左到右关联性),其评估结果为真。这个真变量的值,它是一个大于 0 的数字(我们不知道),a &gt; that_value 被评估,产生结果。但是我可能错了!

任何关于如何评估输出的指针/见解都会很有用。 谢谢。

编辑:我在一个非常老的编译器中进行了测试,结果为 1,这是我的错误,已纠正。

【问题讨论】:

  • 投反对票,请说明投反对票的原因?所以我可以纠正它!
  • 我也没有得到反对票,因为这看起来既奇怪又有趣。但是,“一些编译器”?什么编译器给出什么输出?
  • 我怀疑你会找到一个编译器来回答除 0 以外的任何问题。语言规范一直很清楚 &gt; 运算符的从左到右的关联性。
  • 这个问题主要是关于为什么一个编译器给出的结果与另一个编译器不同,或者为什么你得到0?如果是关于后者,那就是与现有问题的重复。
  • @alk 不,我对不 C 将表达式推送到堆栈中的部分感到困惑,内部评估应该从右到左?

标签: c expression associativity


【解决方案1】:

C 编译器从上到下、从左到右读取代码。
这里,a&gt;b&gt;c => 5 > 10 > c => 0 > 5(false用0表示)=> 0


因此,对于大多数遵循此优先顺序的编译器来说,答案应该是 0

更多详情请关注Order of Operation

【讨论】:

  • +1,但这并不是因为编译器从左到右读取代码,而是因为&lt;的关联性是从左到右。
  • @YuHao 我对不 C 将表达式推送到堆栈中的部分感到困惑,内部评估应该是从右到左?
  • @YuHao 没错。与其他运营商,例如+ 关联性是从右到左
  • 有些操作符是从右到左操作的,比如赋值操作符 x = 5,5 是从右边取的,保留在操作符的左边。除了这些类型的运算符和一些罕见的函数之外,c 上的所有其他函数都是从左到右执行的。
  • @Debojyoti 如果+ 符号从右到左执行,6+++x 的答案是什么;让这里 x 为 5 。
【解决方案2】:

对于关系运算符,关联性是从左到右的,所以你总是应该得到 0。我想知道你是如何在某些编译器上得到 1 的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多