在解决C编程语言的一些能力问题时,我遇到了一个问题,我必须告诉输出。该计划是: -
#include<stdio.h>
int main()
{
int x = 5;
printf("%d %d %d", ++x, x++, ++x);
return 0;
}
根据我之前的知识,我知道printf()
函数的参数从右到左进行评估。因此,手动解决此问题,我得到的输出为: - 8 6 6
但是当我编译这个程序时,我得到的输出为: - 8 6 8
好的here是与这个问题有点相关的问题但是,我特别要求在函数中执行参数而不是为赋值运算符执行。
或者参数的执行是随机发生的吗?如果是这样,那么有一段时间它应该给出一些不同的输出,但它没有给出。即使在不同的编译器上,它也提供与8 6 8相同的输出。
为什么会出现这种异常现象?
由于
答案 0 :(得分:3)
printf()
中的评估顺序并非如您所假设的那样从左到右。评估顺序是未指定:
来自C11草案(附件J,未指明的行为)
函数指示符,参数和的顺序 参数中的子表达式在函数调用中计算 (6.5.2.2)。
From,3.4.4,未指明的行为
使用未指定的值或其他行为 国际标准提供两种或更多种可能性和强加 在任何情况下都没有选择进一步的要求。
示例未指定行为的示例是其中的顺序 评估函数的参数。
因此可以按任何顺序评估三个x++
表达式。但这会导致undefined behaviour,因为您试图在没有插入序列点的情况下多次修改同一个对象。函数指示符中的逗号是分隔符,而不是comma operator。
因为逗号运算符确实在其操作数之间引入了一个序列点。
答案 1 :(得分:1)
这里有两件事情在干扰:
这在实践中意味着什么:因为函数参数的评估具有副作用(增量),所以有多次尝试在没有插入序列点的情况下改变x的值,从而导致未定义的行为。
答案 2 :(得分:1)
行为肯定是意外的,您不应该在函数调用中多次更改变量的值。序列点规则。试着看看link。另请阅读sequence points in a program
在功能调用中尝试不要多次更改一个变量的值