【问题标题】:Operator Precedence - Expression Evaluation运算符优先级 - 表达式评估
【发布时间】:2011-07-24 12:16:36
【问题描述】:

对于以下代码 sn-p,我得到的输出为 1。我想知道它是怎么来的?

void main()
{
int x=10,y=20,z=5,i;
i=x<y<z;
printf("%d",i);
}

【问题讨论】:

    标签: c operator-precedence


    【解决方案1】:

    这是因为您的代码评估为:

    void main()
    {
        int x=10,y=20,z=5,i;
        i=((x<y)<z); //(x<y) = true = 1, (1 < 5) = true
        printf("%d",i);
    }
    

    【讨论】:

      【解决方案2】:

      i=x&lt;y&lt;z;,被解释为i=(x&lt;y)&lt;z,而i=1&lt;z又被解释为i=1&lt;z,计算结果为1。

      【讨论】:

      • 似乎是一个相当常见的错误,如果启用了警告,至少 GCC(可能还有其他编译器)会打印出警告:warning: comparisons like 'X&lt;=Y&lt;=Z' do not have their mathematical meaning
      【解决方案3】:

      你想要什么输出?

      在 C 中,

      i = 2 < 3; //i == 1.
      i = 4 < 3; //i == 0.
      

      如果条件评估为假,则返回值为 0,否则返回 1。
      此外,x

      【讨论】:

        【解决方案4】:

        10 小于 20,结果为 1,1 小于 5,结果为 1。C 不像其他一些语言那样链接关系运算符。

        【讨论】:

          【解决方案5】:
          x<y // 1 as (10 < 20) will return 1
          result of(x<y)<z // 1 as (1<5) will return 1 
          

          【讨论】:

            【解决方案6】:

            它的操作如下: 由于&lt; 是一个逻辑表达式,x&lt;y10&lt;20 为真,即1。所以它变为1&lt;z,即1&lt;5,它再次为真,即分配给i 的1。所以i 是 1。

            【讨论】:

              【解决方案7】:

              C++ 不支持这样的多部分比较。

              x < y < z
              

              被解释为

              (x < y) < z
              

              也就是判断是否x &lt; y,然后看那个boolean是否小于z

              有一些关于为什么的讨论是over at the software engineering StackExchange

              当您发现自己尝试这样做时,您需要将其编写为两个单独的比较,并由一个布尔值连接:

              (x < y) && (y < z)
              

              【讨论】:

                猜你喜欢
                • 2016-12-31
                • 1970-01-01
                • 2021-10-04
                • 1970-01-01
                • 2020-06-23
                • 2011-11-03
                • 2022-11-01
                • 2014-04-14
                • 2017-10-25
                相关资源
                最近更新 更多