为什么在Visual Studio中我= i ++使其增加

艾哈迈德·塔巴拉尼(Ahmed El-Tabarani)

在投票决定将其关闭作为重复副本之前,请注意i = i++C ++ 17具有明确定义的行为。查看评论和答案。

为什么变成6为什么不应该变成5?在另一个方面,输出为5,但在Visual Studio中为6

#include<stdio.h>

int main(){

   int i = 5;
   i = i++;

   printf("%i", i);


}
基思·汤普森

在直到2014年(包括该版本)的标准C ++中,该表达式i = i++具有未定义的行为,因为该对象i被修改了两次,并且两个修改都没有顺序。

2017版(C ++ 17)对表达评估的描述进行了一些更改。C ++ 17 4.6 [intro.execution]中的一个示例说:

void g(int i) {
    i = 7, i++, i++; // i becomes 9

    i = i++ + 1;     // the value of i is incremented
    i = i++ + i;     // the behavior is undefined
    i = i + 1;       // the value of i is incremented
}   

许多阅读该代码的人都会假设行为i = i++不确定。实际上,如果您的编译器正确实现了C ++ 17(并且您以告诉其符合C ++ 17的方式(例如,-std=c++17对于gcc或clang)调用了它),则i赋值after的将为5但是对于符合较早版本的C ++或以不符合标准的模式调用的编译器,其行为仍未定义。

我会注意到g++ -std=c++17 -Walli = i++尽管大约一个星期前从最新的gcc来源构建而成)仍可能未定义警告,尽管运行程序仍会产生C ++ 17正确的结果。

您正在使用的编译器很可能不符合C ++ 17。

更普遍地说,i = i++ 除了作为对编译器一致性的测试之外确实没有充分的理由来编写在兼容的C ++ 17(或更高版本)编译器中,它什么也不做。评估会i++产生的先前值,i并且作为副作用产生更新i-但更新后的值会被分配覆盖。

(在C中,i = i++仍然具有未定义的行为。)

(我欢迎任何阅读过C ++ 14和C ++ 17标准并可以引用暗示这一变化的规范性文本的人的评论。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java中,为什么我不能编写i ++++或(i ++)++?

为什么Typescript会在Visual Studio Code中忽略我的tsconfig.json?

为什么`++`增加Groovy中的final字段?

在bash`i = 0中增加一个变量;ls> $(((++ i)); 回声我= $我; `为什么结果是i = 0

为什么我不能在Visual Studio中编译Apache Cordova项目?

为什么我的project.json / xproj项目无法在Visual Studio 15中打开(预览)?

为什么我的Visual Studio 2015企业版中缺少选项?

为什么Visual Studio在错误的文件夹中寻找我的gulpfile?

为什么我不能在Visual Studio中合并项目SDK版本?

为什么j在(++ i || ++ j)中不增加

为什么使用i ++的for循环似乎增加2而不是1?

为什么我在执行常规教程时在Visual Studio Code中显示了这么多“问题”?

为什么在用Visual C ++递增a [i]之前,我+ = a [i] ++分配i?

Android中的ValueAnimator以及如何使其每秒增加一

为什么我的代码无法在Visual Studio Code中运行?

为什么我的SSIS工具箱在Visual Studio 2019社区中为空?

为什么我们总是需要在Visual Studio中通过nuget安装efcore?

为什么Visual Studio Code中的Python repl告诉我我的对象未定义?

为什么我的实时服务器不能在Visual Studio代码中工作?

为什么在Visual Studio Code中执行git pull后,我仍未提交更改?

在Visual Studio 2013中,为什么我的断点有时会“分离”?

为什么我在Visual Studio“ 2013” SDK示例中遇到问题?

为什么我不能在Visual Studio 2015中使用TypeScript 1.8

为什么我的变量没有增加?

为什么我的函数递增加 2?

为什么我在 Visual Studio 中的 selenium xunit 测试并行运行?

为什么我在 Visual Studio 中收到此警告 C26495?

在 Primality Test 中,我不明白为什么我们将 i 增加 6 (i=i+6) ?以及 for 循环块中的 if 语句条件?

在 Primality Test 中,我不明白为什么我们将 i 增加 6 (i=i+6) ?以及 for 循环块中的 if 语句条件?