【问题标题】:Pre increment and post increment when put together on a single variable like this (++i)++, it works in c++ but not in c将前增量和后增量放在像这样 (++i)++ 这样的单个变量上时,它在 c++ 中有效,但在 c 中无效
【发布时间】:2019-12-05 03:19:11
【问题描述】:

我用值 3 初始化了一个变量 i,然后在我的代码中添加了一个语句 (++i)++。但是,在 C 中,它显示错误“需要作为增量操作数的左值”。但是,如果我将这个类似的代码放在 c++ 中,它可以工作并显示双倍增量,输出为 5。但是,我的一个朋友使用 c 尝试了他的编译器,它给出了输出 4。

//using c

#include <stdio.h>

int main()
{
    int i=3;
    (++i)++;
    printf("%d",i);
    return 0;
}
 //using c++

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int i=3;
    (++i)++;
    cout << i << endl;
    return 0;
}

我正在使用 GNU GCC 编译器。

【问题讨论】:

  • 它在 C 中被定义为非法的,原因你听说过。 (i++ 的结果是一个右值,第二个++ 不能应用。) 但是C 和C++ 是不同的语言,C++ 有不同的规则。如果您想避免混淆,请使用i += 2
  • 很确定这是 C++ 中未定义的行为。仅仅因为您的编译器正确并不意味着这是正确的。简而言之:不要那样做。

标签: c++ c increment


【解决方案1】:

这是已知的未定义行为。从语法上讲,这个程序在 C++ 中是正确的,并且编译器会生成一些二进制代码……但标准允许它生成任何代码,甚至是返回 100 或格式化磁盘的代码。在实际情况下你可能会观察到非常奇怪的异常情况,例如编译器可以在你的(++i)++语句之后丢弃整个代码,因为标准允许它在程序进入UB状态后立即为所欲为。在您的情况下,这意味着根本没有输出(或者程序将打印“Hello World”而不是整数值)。

我相信你只是在做一个实验。结果是:你的编译器和你朋友的编译器都是正确的。

【讨论】:

  • 非常感谢。然而,这不是一个实验,而是一个迷你测试的问题,在我和我的朋友之间造成了混乱。但是,我现在明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2012-10-17
  • 2023-01-14
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多