指示在c中评估操作数的顺序

时间:2017-08-21 00:18:11

标签: c operator-precedence

语句puts("a") + puts("b")未定义。 这是因为C标准中没有规定这些是否应该从左到右或从右到左执行,这样你才能得到

a
b

b
a

是否有一种干净的方式来决定表达式中的操作顺序?

我唯一能想到的是使用复合语句,例如

({
    int temp = puts("a");
    temp += puts("b");
    temp;
})

虽然这是不可携带的,但比我希望的时间长一点。

如何最好地实现这一目标?

2 个答案:

答案 0 :(得分:6)

如果在表达式之前声明int变量,则可以在计算表达式中的总和时使用逗号运算符强制执行命令:

int temp;
...

(temp = puts("a"), temp + puts("b"))

如C标准中所述:

  

6.5.17逗号运算符

     

<强>语法

 expression:
     assignment-expression
     expression , assignment-expression
     

<强>语义

     

逗号运算符的左操作数被计算为void表达式;它的评估与右操作数之间存在一个序列点。然后评估右操作数;结果有其类型和价值。

但请注意,根据Jonathan Leffler评论的puts()的语义,表达式的值不会非常有用。

答案 1 :(得分:1)

强制评估顺序的唯一方法是使用单独的语句。 编译器可以使用任何认为必要的顺序。所以对于函数调用f1()+ f2()+ f3();其中一个函数调用可以在另一个之前调用。您对该语句的唯一影响是如何处理这些函数的返回。简而言之,只需使用单独的语句即可。很可能无论你做什么,把调用放在一个循环中应该没问题。

体面参考: http://en.cppreference.com/w/c/language/eval_order