整数变量上的双倍增量,它是否按预期工作
Double increment on an integer variable, does it work as intended?
我有一些代码,其中的行可以增加计数器。
++ count;
有时我有一个 if 条件,这意味着我应该将计数增加 2。
count += 2;
"双倍增量"的工作方式是否相同?
++ ++ count;
了解 C 和 C++ 编译器是否以相同的方式解释这一点会很有帮助。
由于这显然在语法上是正确的,剩下的问题是:"这个 UB 是因为未排序的写入吗?
它不是(在 C++11 及更高版本中),因为
5) 内置的预递增和预递减运算符的副作用在其值计算之前先排序(由于定义为复合赋值而隐式规则)
(从这里开始)
因此,代码从 C++11 开始就很好了。
但是,在此之前的排序规则是不同的,在C++11之前,代码实际上有UB。
在 C 语言中,该代码甚至无法编译。
事实上,C和C++之间甚至不同C++标准之间的行为不同,并且首先会出现这个问题,这一事实暗示了简单count += 2;
是更安全,更具可读性的版本。你应该更喜欢它而不是"可爱而聪明"的++ ++count;
。
有两种方法。一个显然有效的,你必须在StackOverflow上提出一个问题。有评论说"在 11 C++或更晚"......您如何确定您的 C++ 代码以 C++ 11 而不是旧版本运行?即使您使用的扩展不属于早期语言,您的语言也可能是 C++0x,并且带有某些扩展。
显然,您不应该关心第二种方法是否有效,而是使用明显有效的方法。
相关文章:
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 在 Eclipse 中添加库的工作方式是否与在 Visual Studio 中相同?
- 隐式转换是否应该在模板参数的上下文中工作?
- C++:检查动态取消分配是否正常工作
- 将正常函数的工作分配给多个线程是否安全
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- 我的随机生成器是否不工作,或者我决定人/骨架是否击中对手的方式是否有错误
- SetTimer (带有回调函数)是否通过启动新线程来工作?
- 返回对局部变量的引用是否正常工作?
- 右值引用是否像右值引用一样工作
- C++编译器 g++.exe 无法编译简单的测试程序 - 确定 CXX 编译器是否工作失败
- 我是否应该在构造函数或成员方法中进行大量初始化工作
- std::move 是否始终按预期工作
- 在为工作线程访问 lambda 中捕获的向量列表中的元素引用时,是否需要互斥锁?
- opengl32.lib如何在Windows(仅1.1版本)上工作?它是否真正实现了OpenGL函数
- 我对变量在递归函数中如何工作的理解是否正确?
- 下课时的数组是否可以正常工作?
- 是否有任何简单的方法来查找当前的工作目录?C
- 线程安全定时来对齐在多个线程中收集的数据-QElapsedTimer是否工作
- 函数用于检查二叉树是否为二叉搜索树或是否工作