在 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 &lt;&lt; x++ &lt;&lt; ++x; 只是另一种表示法:

operator<<( operator<< (cout, x++), ++x);

评估 x++++x 语句的 orderundefined,因此也是您的代码的效果。

即使在您的特定示例中似乎从右到左发生,您也不应该以任何方式依赖它。

只需使用多个语句进行另一个实验:

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 递增和递减 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

指针的递增递减

C++学习-算数运算符

在递减然后递增并且可能包含重复项的列表中查找最小值

i++与++i 递增递减运算符的前置与后置

在 sizeof(++n) 表达式中未调用增量运算符 [重复]

C ++迭代器取消引用和前缀递增/递减样式? *--Iter ok 风格是不是明智?