-1

我一直试图了解 printf 如何处理传递给它的参数。更具体地说,有人可以解释以下输出是如何发生的。

int a=1;
printf("%d %d %d",++a,a,a++);// outputs: 3 3 1

a=1;
printf("%d %d %d",a++,a,a++);// outputs: 2 3 1

a=1;
printf("%d %d %d",a,a,a++);// outputs: 2 2 1

a=1;
printf("%d %d %d",a,a++,a);// outputs: 2 1 2

a=1;    
printf("%d %d %d",a,a,++a);// outputs: 2 2 2

cout语句出现相同的输出。

4

2 回答 2

4

这段代码

printf("%d %d %d",++a,a,a++);// outputs: 3 3 1

在同一个表达式中修改 a 两次。准确地说,它修改了两次,没有中间的序列点。因此,此代码具有未定义的行为,任何对其进行推理的尝试都是徒劳的。编译器可以为所欲为,不同的编译器会做不同的事情。有关详细说明,请参阅未定义的行为和序列点。

使用这样的代码

printf("%d %d %d",a,a,a++);// outputs: 2 2 1

当 a++ 递增时,它是未定义的,它可能在 a 用于其他参数之前或之后。所以你的输出可能会有所不同。

这里唯一要理解的是不要写这样的代码。遵循这条规则,你就不会出错。

于 2013-04-25T11:40:18.973 回答
2

printf这与如何和cout工作没有任何关系。C++ 标准定义了对表达式求值及其副作用的排序。措辞在 C++03 和 C++11 之间发生了一些变化,但它目前将函数参数的评估描述为unsequenced。也就是说,您无法保证函数参数的执行顺序。

由于您在两个未排序的表达式中使用a和 modify的值a,因此您有未定义的行为。

如果标量对象上的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值的值计算是未排序的,则行为未定义。

于 2013-04-25T11:41:46.437 回答