为什么此代码中没有违反顺序点规则的行为?

时间:2018-11-24 03:00:53

标签: c compiler-warnings sequence-points

使用的编译器:gcc 8.2

命令行:-Wall

我目前对序列点冲突的理解是某种程度上取决于给定表达式中操作数/子表达式的求值顺序的代码。之所以这样,是因为表达式here中未指定表达式中操作数的求值顺序。 因此,代码如下:

a = 5;
b = a + ++a;

是违例,并且被 -Wsequence-point 捕获,因为结果中存在歧义,即应该是(5 + 6)还是(6 + 6)? 我认为下面的代码中存在类似的歧义,因为我们不知道第二个++ a是否会在第一个之前进行评估:

#define MIN(a, b) (((a) < (b)) ? (a) : (b))

int use() 
{ 
    int min;
    int a = 4, b = 5;
    min = MIN(++a, b);
    //min = ((++a) < b) ? (++a) : b;
    return min;
}

我显然缺少一些东西,因为此代码不会在 -Wseqeuence-point 上警告我。有人可以帮我了解一下吗? 请注意,我已经故意定义了MIN。

1 个答案:

答案 0 :(得分:4)

根据ISO C11标准,在三元/条件运算符的谓词评估与它的任一替代项(无论哪个被评估)之间存在一个顺序点。因此,两个int j = 10; for (int i = 1; i <= 20 ; i++) { if (currentScore == j) { editor.putInt("TOP_LEVEL", topLevel + 1); editor.apply(); break; } j = j + 10; } 通过中间的序列点相对于彼此进行排序。

  

§6.5.15条件运算符

     

语法

     

1。

++a
     

[...]

     

语义学

     
      
  1. 第一个操作数被求值;在它的评估与第二个或第三个操作数的评估(无论哪个被评估)之间都有一个序列点。仅当第一个操作数不等于0时,才对第二个操作数求值;仅当第一个操作数等于0时,才计算第三个操作数;结果是第二个或第三个操作数的值(以所评估的为准),转换为以下所述的类型。
  2.