语句puts("a") + puts("b")
未定义。
这是因为C标准中没有规定这些是否应该从左到右或从右到左执行,这样你才能得到
a
b
或
b
a
是否有一种干净的方式来决定表达式中的操作顺序?
我唯一能想到的是使用复合语句,例如
({
int temp = puts("a");
temp += puts("b");
temp;
})
虽然这是不可携带的,但比我希望的时间长一点。
如何最好地实现这一目标?
答案 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();其中一个函数调用可以在另一个之前调用。您对该语句的唯一影响是如何处理这些函数的返回。简而言之,只需使用单独的语句即可。很可能无论你做什么,把调用放在一个循环中应该没问题。