在 C++ 中使用 cout 递增和递减 [重复]
Posted
技术标签:
【中文标题】在 C++ 中使用 cout 递增和递减 [重复]【英文标题】:increment and decrement with cout in C++ [duplicate] 【发布时间】:2016-01-31 10:59:27 【问题描述】:我是 C++ 新手,正在研究递增和递减运算符。 所以我尝试了这个例子:
int x = 4;
cout << ++x << " " << x++ << " " << x++ << endl << endl;
cout << x << endl;
它在 C++ .NET 和 QtCreator 以及 5 个在线 C++ 编译器上返回此奇怪输出:
7 5 4
7
奇怪的是我期待这样的事情:
5 5 6
7
你能解释一下发生了什么吗?
【问题讨论】:
当您将多个++
放在同一行且没有序列点时,编译器不需要按任何特定顺序执行操作。
@MarkRansom ||你能解释一下吗
谷歌一下。这个问题几乎每周都会被问到。
【参考方案1】:
请注意cout << x++ << ++x;
只是另一种表示法:
operator<<( operator<< (cout, x++), ++x);
评估 x++ 和 ++x 语句的 order 是 undefined,因此也是您的代码的效果。
即使在您的特定示例中似乎从右到左发生,您也不应该不以任何方式依赖它。
只需使用多个语句进行另一个实验:
cout << ++x << " ";
cout << x++ << " ";
cout << x++ << endl;
你的问题的解决方法是:
切勿编写导致未定义行为的代码! :)
【讨论】:
如何定义报表顺序? 我知道我可以使用多个语句,但我需要知道编译器如何执行我的示例。 @Aliosm 了解编译器如何处理未指定的代码是一种虚假的经济。这可能很有趣,但知识几乎毫无价值,因为你不能指望它保持不变。你的编译器可能给出一个数字,你的邻居给出另一个,而你的 Bob 叔叔可能会得到第三个数字。编译器可以随心所欲地做任何事情。【参考方案2】:对于您的示例,结果未定义。这是因为x++
或++x
在一行中的评估顺序是未定义的。
简而言之,如果您在使用时想要可预测的行为 operator ++ 那么它所应用的变量应该只出现一次 在被评估的表达式中。
【讨论】:
您的意思是,如果编译器在同一行中看到 ++ 运算符超过 1 次,则不优先考虑并只运行它? @AliOsm..这意味着如果编译器多次看到 ++ 运算符,则不知道它将按什么顺序计算......【参考方案3】:这就是所谓的未定义蜂巢,取决于您使用的编译器,要更好地理解这一点,您必须了解计算机体系结构以及编译器的工作原理:
cout << x++ << hello << x++ << endl
一个编译器可以将此序列转换为二进制序列,这将执行以下操作
increment x
print x
print hello
increment x
print x
print endl
而第二个编译器可以这样做
print x
increment x
print hello
print x
increment x
print endl
第三个可以这样做
print x
print hello
print x
print endl
increment x
然后一个人可以做以下事情
increment x
print x
print hello
print x
print endl
解决这个问题的最佳选择是:
x++;
cout << x << hello;
x++;
cout << x << endl;
【讨论】:
我在 .NET 框架上使用 C++,我需要知道编译器如何执行我的示例并打印输出。 这是我不知道的问题,我认为 Visual Studio 正在倒退。把endl
放到栈增量x上,把hello放到栈上,增量x放到栈上,最后打印出来。以上是关于在 C++ 中使用 cout 递增和递减 [重复]的主要内容,如果未能解决你的问题,请参考以下文章