【问题标题】:Why do these 2 output styles give different answers [duplicate]为什么这两种输出样式给出不同的答案[重复]
【发布时间】:2018-05-19 17:14:08
【问题描述】:

那么在 c++ 中,为什么这两个输出不同?

int x;
for(int x=2;x<5;x++);
cout<<x<< x++ << ++x << x <<endl;

这个输出 7677

cout<<x<<endl;
cout<<x++<<endl;
cout<<++x<<endl;
cout<<x<<endl;

这个输出 55​​77

那么为什么它们不同呢?

我猜是第一个同时计算整行,这就是它输出 7 的原因,但为什么 ++x 仍会输出 6?这里是否有某种优先级或发生了什么?

【问题讨论】:

  • 首先,您的x 在第一个示例中未初始化。循环中的x 与全局声明的不一样。
  • 因为其中只有一个是明确定义的,而另一个是未定义的行为(没有序列点,未初始化x,因为循环后有分号)。
  • 这段代码怎么编译,因为你在for循环中有i,而不是x?确保如果您要显示代码块的输出,请复制并粘贴您正在运行的准确代码——不要匆忙在编辑窗口中输入代码。跨度>
  • 输出将在 c++17 中得到很好的定义。
  • for(int x=2;i&lt;5;x++); 中的i 是什么???这个空体循环的目的是什么?

标签: c++


【解决方案1】:

在 C++17 中应该没有什么不同,但在它之前没有。

在移位运算符表达式E1&lt;&lt;E2E1&gt;&gt;E2 中,E1 的每个值计算和副作用都在 E2 的每个值计算和副作用之前排序(C++17 起)

如果你使用 C++17 之前的 C++ 标准,那么行为是undefined,所以编译器可以做任何你不想要的工作。

如果您想了解更多关于评估表达式可以在哪些上下文中导致未定义行为的信息,请参阅以下内容:

https://en.cppreference.com/w/cpp/language/eval_order

【讨论】:

  • 那些不是轮班。
  • @ScottHunter 内置移位和重载移位都适应它。
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多