我执行了以下代码。
int main(void)
{
int c;
c=0;
printf("%d..%d..%d \n", c,c,c);
c=0;
printf("%d..%d..%d \n", c,c,c++);
c=0;
printf("%d..%d..%d \n", c,c++,c);
c=0;
printf("%d..%d..%d \n", c++,c,c);
return 0;}
我希望输出为
0..0..0
1..1..0
0..1..0
0..0..0
但是输出(用gcc编译)是
0..0..0
1..1..0
1..0..1
0..1..1
我的期望有什么问题? 在gcc中,评估顺序是从右到左。是吗?
答案 0 :(得分:5)
我的期望有什么问题?
未指定功能参数的评估顺序 - 由实现决定。此外,参数之间没有sequence point * ,因此在序列点之前再次使用修改后的参数无法给出可预测的结果:它是未定义的行为(thanks, Eric, for providing a reference to the standard)
如果您需要特定的评估订单,则需要将参数评估为完整表达式(强制每个表达式之间的序列点):
int arg1 = c++;
int arg2 = c;
int arg3 = c;
// This: printf("%d..%d..%d \n", c++,c,c);
// Becomes this:
printf("%d..%d..%d \n", arg1, arg2, arg3);
<小时/> * 序列点是代码中某个位置的奇特名称,之后您可以依赖已应用的所有前面表达式的副作用,例如增量或减量。