Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 你能解释一下输出吗?_C++_C - Fatal编程技术网

C++ 你能解释一下输出吗?

C++ 你能解释一下输出吗?,c++,c,C++,C,以下代码的输出应该是什么?为什么?我有点困惑 int a =10; printf("%d %d %d",a,a=a+10,a); 输出是不确定的,因为a=a+10是一种副作用,编译器可以在任何其他参数之前或之后自由地对其进行计算 编辑:正如David指出的那样,行为实际上是未定义的,这意味着所有的赌注都被取消了,你不应该编写这样的代码。在实践中,编译器几乎总是做一些似是而非和不可预测的事情,甚至可能在调试和优化构建之间有所不同。我不认为抹香鲸是一种可能的结果。牵牛花?可能。未定义。 标准未定义

以下代码的输出应该是什么?为什么?我有点困惑

int a =10;
printf("%d %d %d",a,a=a+10,a);

输出是不确定的,因为
a=a+10
是一种副作用,编译器可以在任何其他参数之前或之后自由地对其进行计算

编辑:正如David指出的那样,行为实际上是未定义的,这意味着所有的赌注都被取消了,你不应该编写这样的代码。在实践中,编译器几乎总是做一些似是而非和不可预测的事情,甚至可能在调试和优化构建之间有所不同。我不认为抹香鲸是一种可能的结果。牵牛花?可能。

未定义。
标准未定义函数参数的求值顺序。

所以这个输出可以是任何东西

它高度依赖于编译器

因为参数的求值顺序不是由标准指定的

函数调用中a、b和c的求值顺序
f(a、b、c)
未指定

阅读有关序列点的内容,以获得更好的想法:(在这种特殊情况下,未定义的行为不是由于序列点造成的。感谢@Stumith指出这一点)

命令式编程定义了计算机程序执行过程中的任何一点,在该点上,可以保证已执行先前评估的所有副作用,且尚未执行后续评估的任何副作用。它们通常在引用C和C++时被提及,因为一些表达式的结果可以依赖于它们的子表达式的评价顺序。添加一个或多个序列点是确保一致结果的一种方法,因为这限制了可能的评估顺序

当同一变量被多次修改时,序列点也起作用。一个经常引用的例子是表达式
i=i++
,它既将
i
赋值给自身,又递增
i
i
的最终值是多少?语言定义可能指定一种可能的行为,或者干脆说该行为未定义。在C++和C++中,对这样的表达式的求值产生<强>未定义的行为< /强>


不是为了修改以前的正确答案,而是为了补充一点信息:根据标准,即使是这样也没有定义:

int a =10;
printf("%d %d %d", a = 20, a = 20, a = 20);

谢谢你的回答……) 该行为实际上是未定义的,并且依赖于编译器。以下是一些输出

使用Turbo c编译: 20 10

使用Visual Studio c++编译: 20 20 20

用CC编译: 20 20 20

使用gcc编译: 20 20 20

使用dev c++编译:
20、20、10、

< P>使用DIWW编译器在HeaveDe+C++中:20 20 10斯蒂法诺P>最后检查函数函数的顺序是不确定的,所以这里的输出也是不确定的。@我不在乎名声。这是我在stack overflow的第二天,我来这里是因为我有一个问题。A2ZI再次看到Neil在模仿著名的“一碗牵牛花”:)只是想知道:谁真的在乎结果?不管怎样,这都是未定义的行为@ereOn它与结果无关:它用于验证不同的编译器确实表现出不同的行为,而不是盲目地相信答案。@Amarghosh:即使所有经过测试的编译器都产生了相同的结果,也并不意味着答案是错的:这只是由未定义的行为引发的无限可能性之一;)@艾瑞恩,我不是在暗示什么。我只是鼓励他的态度:他本可以很好地想到“哦,是UB”然后停在那里——这也很好;但他很关心,想进一步探索。我认为这对程序员来说是一个好的态度。@阿马古什:但是,编译器的实验,为了推断标准,以及可以依靠什么,不是一件好事。如果您愿意,请进行实验,但请注意语言定义。特别是对于本例,逗号并不定义序列点。这使得编译器可以自由地以他们选择的任何顺序执行函数参数,以生成最有效的代码。实际上,行为是未定义的,这意味着系统所做的任何事情(包括变成抹香鲸和一碗牵牛花)都完全符合标准。实际上,Marcelo,我们在系统中发现了一个与之完全相同的错误。争论中的副作用。调试时一切都很好,但当我们开始发布时,恶魔开始从每个人的鼻子里飞出来。该死的乌布。