Possible Duplicate:
Undefined Behavior and Sequence Points
  How the statement x=x++ + y++; executes to the value 3?




我想知道在这种情况下printf是如何工作的:

int i = 0;
printf("%4d%4d", i++, i);


结果是0 1

在另一种情况下

int i = 0;
printf("%4d%4d", i, i++);


结果是1 0

最佳答案

这与printf无关,与参数评估的顺序以及编译器执行代码的方式无关。行为是不确定的,其结果将取决于您的编译器,调用约定和月相。

在您的两个示例中,之前/之后递增的规则均优先。您的特定编译器了解到,在评估增量之前,它必须使用i的值,并且优先于调用函数调用的参数而不是不调用函数调用的参数。第二次使用变量i会导致编译器在调用printf的过程中插入中间语句,

重要的是要注意,i++并不意味着(通常教导)“在执行此行之后增加i”,它的意思是“在给我其值之后,在执行下一行之前的某个时候,增加i”。对于编译器执行正式称为“未定义行为”的操作,这有很大的余地。

正如@Als在评论中指出的那样,您已经设法将未定义和未指定的行为合并在一行代码中。

关于c++ - printf函数如何工作? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9939148/

10-11 23:09
查看更多