【问题标题】:Why x = x++; doesn't work as I would expect? [duplicate]为什么 x = x++;不像我预期的那样工作? [复制]
【发布时间】:2014-10-14 20:53:24
【问题描述】:

我总是希望它可以像这里描述的那样工作:What is x after "x = x++"?

但是当我尝试测试它时:

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

结果不是我预期的 0,而是 1。我们在 VS2012 和 g++(4.7 版)中对其进行了测试。

请注意,此代码按预期打印 0:

int x = 0;
int y = x++;
printf("y = %d\n", y);

【问题讨论】:

  • 因为你在调用 UB。它可以返回任何它想要的东西并且仍然是正确的。
  • 或者不返回任何东西,而是召唤鼻恶魔,就此而言。
  • 因为你的期望是错误的。该问题被标记为“java”;这个问题被标记为“c++”。
  • 你真的不应该混合'n'比较语言,直到你对它们非常流利。 Java 和 C++ 非常不同。 JavaScript 是此类“比较”的最佳参考。你会相信 0 == ""true 吗?在 JavaScript 中是的。但是你会期望它在另一种语言中如此吗?不是。
  • Java 和 C++ 是不同的语言,它们恰好有一些共同的句法符号。这些符号的含义通常不同。

标签: c++ operators expression


【解决方案1】:

请注意,您正在链接 Java 问题,但您是用 C++ 编写的。

在 C 中(并在 C++ 中继承),x = x++; 未定义,因为您在两个序列点之间修改了两次 x。这意味着代码实际上可以做任何事情,包括从您的银行账户中窃取资金和雇佣杀手杀死您,而编译器是正确的。

很高兴它只将 x 设置为 1。:-)

【讨论】:

  • 为什么这和int postinc(int& i) { int x = i; i = i + 1; return x; } i = postinc(i)有什么不同?顺便说一句:我的 GCC 对 C 和 C++ 以及 -std= 我所做的任何尝试都返回 0。
  • 所以现在我明白了,它在此处指定,在 C 和 C++ 中的序列点中:en.wikipedia.org/wiki/Sequence_point 重载运算符充当函数并创建序列点,因此运算符是否重载很重要或本地人。
  • @firda kovarex 打败了我。基本上函数调用引入了一个序列点(实际上,那些不再存在于语言中,但它仍然是最好的近似值)并且那段代码是格式良好的。只是没用。
  • @Xarn:没用,但在 C++ 中必须返回零/原始值(在 C 中不知道)。看起来 C++ 的面子越来越好了。 a[i++] = i 当然是未定义的(或未指定的),因为未定义/指定评估 i++i(读取为 fetch i)的顺序。我错了还是答案there不好?
  • @kovarex: 我的 Cygwin GCC 4.8.3 32bit 为 int x = 0; x = x++; printf("%d", x); 返回零;)
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多