指示在 c 中计算操作数的顺序

Dictate order that operands are evaluated in c

语句puts("a") + puts("b")未定义。 这是因为 C 标准中没有指定这些是应该从左到右还是从右到左执行,所以你可以得到

a
b

b
a

是否有一种简洁的方法来指定表达式中的运算顺序?

我唯一能想到的就是用复合语句如

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

虽然这是不可携带的,而且比我希望的要长一点。

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

如果您在表达式前声明一个 int 变量,您可以在计算表达式内的总和时使用逗号运算符强制排序:

int temp;
...

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

按照 C 标准中的规定:

6.5.17 Comma operator

Syntax

 expression:
     assignment-expression
     expression , assignment-expression

Semantics

The left operand of a comma operator is evaluated as a void expression; there is a sequence point between its evaluation and that of the right operand. Then the right operand is evaluated; the result has its type and value.

但是请注意,鉴于 puts() 的语义,表达式的值不会很有用,正如 Jonathan Leffler 评论的那样。

强制计算顺序的唯一方法是使用单独的语句。 编译器可以使用任何认为必要的顺序。所以对于函数调用 f1() + f2() + f3();这些函数调用中的任何一个都可以先于另一个调用。您对该语句的唯一影响是如何处理这些函数中的 returns。所以简而言之,只需使用单独的语句。无论您在做什么,很可能将调用置于循环中就可以了。

不错的参考资料: http://en.cppreference.com/w/c/language/eval_order