【问题标题】:If ++ (pre/post) have higher precedence, why && is being evaluated first? [duplicate]如果 ++ (pre/post) 具有更高的优先级,为什么 && 首先被评估? [复制]
【发布时间】:2013-11-02 15:15:32
【问题描述】:

这是我的程序:

 int main(void)
 {
  int i, j, k, m;
  i=-3, j=2, k=0;
  m = k++ && ++i && ++j;
  printf("%d, %d, %d, %d\n", i, j, k, m);
 return 0;
 }

上面程序的输出是:

 -3 2 1 0 

但根据运算符优先级表,我猜 ++ 应该首先评估。 我也尝试在它们周围加上括号,但输出仍然保持不变。 我在某处读到,无论如何,加上括号会使其首先评估。

有人,请说清楚,它是如何评估的。 提前致谢。

【问题讨论】:

  • 你想做什么?什么是'm'?
  • 因为k = 0 所以表达式k++ && ++i && ++j; 等价于0 && ++i && ++j;k++;0 && ++i && ++j; = False 所以++jk++ 不会被计算。
  • 另见this
  • 优先级和括号都与评估顺序无关。评估顺序是通过排序来定义(定义时),这是一个完全不同的概念。排序(或没有排序)是运算符的固有属性,不能通过任何括号更改。

标签: c


【解决方案1】:

这里发生的是短路。 k++ 计算结果为 0,这是错误的。因此整个布尔表达式k++ && ++i && ++j 为假,所以++i++j 永远不会被执行。

【讨论】:

    【解决方案2】:

    您将 优先级评估顺序 混淆了。优先级定义了操作数的分组方式。 ++ 的更高优先级使得表达式等价于:

    m = (k++) && (++i) && (++j);
    

    但评估顺序无关紧要。 &&的捷径保证 首先计算它的左操作数。

    一般来说,大多数运算符不指定求值顺序,有四个例外:逻辑与&&、逻辑或||、条件运算符?: 和逗号运算符,


    作为不同评估顺序的具体示例:

    给定int i = 0i + (i++)的结果是未指定的,编译器可能会先评估i++,这会修改i的值,编译器可能会选择先评估i。你应该避免这样的表达。

    另一方面,i && (i++) 的结果是确定的,因为&& 确保首先计算左操作数 i,因为它为零,所以永远不会计算右操作数 i++

    【讨论】:

    • 您能告诉我与示例的确切区别吗?我总是认为优先级较高的运算符首先评估:(
    • @1lastBr3ath 我添加了一个例子,希望你更清楚。
    • 这也是未定义的吗? int main(void) { int x, y, z; x = y + z + 10 == (y = z = 0); printf("x = %d, y = %d, z = %d", x, y, z);返回0; }
    • @1lastBr3ath 不,条件运算符首先计算其第一个操作数,然后根据第一个值是非零还是零计算其第二个或第三个操作数。您是否认为?: 是从右到左操作的,因为它是正确的关联
    • @1lastBr3ath 这个话题太大了,不能在评论中讨论。基本上,precedence 决定了不同运算符的分组,对吧?但实际上有些运算符具有相同的优先级,例如二进制+-关联性决定了具有相同优先级的运算符的分组。 1+2-3 被分组为 (1+2)-3,对吧?那是因为+ - 是左助理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多