c++ - 不可预测的输出

标签 c++ c

Possible Duplicate:
FAQ : Undefined Behavior and Sequence Points

#include<iostream>
#include<stdio.h>   
int main(){
   int myVal = 0;
   printf("%d %d %d\n", ++myVal,myVal,++myVal);
   myVal = 0 ; /*reset*/      
   std::cout<<++myVal<<" "<<myVal<<" "<<++myVal<<std::endl;
   return 0;
}

在这两种情况下我都得到了输出 2 2 2。怎么会是2 2 2呢?我预计 2 1 1 或 1 1 2

最佳答案

预自增运算符实际上已编译,因此对它的所有调用都会在调用 printf 和 cout 的表达式求值之前执行。

就好像你有:

int myVal = 0;
myVal += 1;
myVal += 1;
printf("%d %d %d\n", myVal, myVal, myVal);

还可以想象,在这种情况下,编译器优化可以使用常量“2”值,而不是在运行时执行增量。

编辑:双语:这个答案试图解释OP代码中具体发生的情况,但这确实是未定义行为的一个例子,因为编译器在这种情况下几乎可以做任何他们想做的事情。

关于c++ - 不可预测的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224459/

相关文章:

c++ - 在函数中创建一个数组并将其返回给main()

c - Clang 中的结构填充警告

c++ - std::cin 中的运算符 >> 不匹配

c++ - 模板参数约束

c++ - Qt widget 应用程序输出到控制台

c - 在 C 中将不同的函数返回类型存储在一个 union 中

c - 具有多个输入字段的用户界面

c - Sqlite:为查询结果创建新表并保留原始模式

正确使用 malloc 和 strcat 以避免 valgrind 内存错误

c++ - 将结构从 C++ dll 返回到 Python