|
|
1
5
我能想到的最简单的答案是: C++是用抽象机器来定义的。在抽象机上执行的程序的输出只根据执行“副作用”的顺序来定义。副作用定义为对IO库函数的调用,以及对标记为volatile的变量的更改。 允许C++编译器在内部做任何事情来优化代码,但是它们不能改变写入到易失性变量和IO调用的顺序。 在内部 序列点可以重新排序。 这就是为什么理解它们很重要。如果没有这种理解,你对c++程序是什么(以及它如何被agreessive编译器优化)的基本理解是有缺陷的。 |
|
|
2
2
|
|
|
3
2
序列点的确切技术细节会变得毛茸茸的,是的。但遵循这些准则几乎解决了所有实际问题:
幸运的是,在大多数“预期”的地方都有序列点:
超载
|
|
|
4
1
值得一提的是,序列点的存在是因为如果你不知道它们,你可以很容易地编写代码,这些代码看起来在测试中运行良好,但实际上是未定义的,当你在另一台计算机上运行或使用不同的编译选项时,它们可能会失败。特别是如果你以写作为例
我认为没有必要完全学习所有的规则——但是你需要知道什么时候需要检查规范,或者更好的是——什么时候重写你的代码使之成为这样,如果一个更简单的设计也能工作的话,你就不用依赖序列点规则了。 |
|
|
5
0
... 并不总是做你认为会做的事。这会使调试变得很痛苦。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |