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/