【问题标题】:Ternary operator precedence in c [closed]c中的三元运算符优先级[关闭]
【发布时间】:2014-02-19 22:16:38
【问题描述】:

在下面的代码中输出是 1 但它应该是 2 。怎么样?

#include<stdio.h>

int main()
{
        int count=0,i;
        int num[4]={1,2,3,4};

        for(i=0;i<4;++i)
            count = count+(num[i]%2==1)?1:0;

        printf("%d",count);
        return 0;
}

【问题讨论】:

  • 当然,count += num[i] % 2; 太复杂了,你决定你的程序需要分支。
  • 我注意到您的原始代码和所有给出的答案都是错误的,因为x%2==1 首先没有检查奇怪。 x%2!=0 检查奇数。 如果操作数是负数,那么余数也可以是负数。

标签: c output ternary-operator


【解决方案1】:

运算符优先级。将行更改为:

    count = count + ((num[i] % 2 == 1) ? 1 : 0);

或者,甚至更好:

    count += num[i] % 2;

解释一下:+ 的优先级高于?:。因此,您的原样实际上被解释为:

    count = (count + (num[i] % 2 == 1)) ? 1 : 0;

因此,在循环的每次迭代中,count 都被设置为10,如下所示:

  i   |  count  |  (num[i] % 2 == 1)  | count + (num...)  |  new count
------+---------+---------------------+-------------------+-------------
  0   |    0    |      1 (true)       |      1            |    1    
  1   |    1    |      0 (false)      |      1            |    1
  2   |    1    |      1 (true)       |      2            |    1             
  3   |    1    |      0 (false)      |      1            |    1

【讨论】:

  • 优先顺序,而不是顺序。
【解决方案2】:

变化:

 count = count+(num[i]%2==1)?1:0;

count = count+((num[i]%2==1)?1:0);

+ 二元运算符的优先级高于条件运算符。

【讨论】:

  • 这是纠正问题的最小更改。使用+= 将是额外的样式改进(并且将消除对额外括号的需要)。
  • @KeithThompson 是的,我只是在解释观察结果的原因,我让正确的解决方案作为 OP 的练习 ;)
猜你喜欢
  • 2023-03-07
  • 2010-12-19
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2016-05-06
  • 2016-03-30
相关资源
最近更新 更多