【发布时间】:2018-11-09 10:05:07
【问题描述】:
我读过Order of evaluation,但不是很明白。顺序是指运行时的执行顺序还是源代码中的逻辑顺序?
让我们看一个代码sn-p如下:
void f()
{
int a = 10; // A
int b = 20; // B
//...
}
这是否意味着表达式A 在表达式B 之前排序?
c++ 编译器是否允许重新排序代码如下?
void f()
{
int b = 20; // B
int a = 10; // A
//...
}
如果编译器确实像上面那样对代码重新排序,那么我们是否应该说表达式B 在A 之前排序?
【问题讨论】:
-
排序是关于运行时的评估顺序。只要不破坏排序规则,编译器就可以重新排序任何东西。这些规则也适用于 表达式 而不是语句。至于您的示例,它与排序规则无关,因为它是两个语句,并且编译器可以根据需要对其进行重新排序,因为它是两个独立语句。如果你有例如
int b = a;则无法重新排序。 -
@Someprogrammerdude 如果我有 int a = x + 1; int b=y+1;?
-
那仍然是两个独立的语句,彼此没有依赖关系。并且编译器可以以任何它喜欢的方式重新排序这些初始化。
-
另请阅读Undefined behavior and sequence points。它可以帮助您更好地理解这些事情。
-
而且很多现代 CPU 都出现故障了,所以它们也可以在运行中重新组织指令,只要它们之间没有依赖关系。