我最近对以下 C++ 片段感到困惑:
#include <cstdio>
int lol(int *k){
*k +=5;
return *k;
}
int main(int argc, const char *argv[]){
int k = 0;
int w = k + lol(&k);
printf("%d\n", w);
return 0;
}
看看线:
int w = k + lol(&k);
直到现在,我认为这个表达式将从左到右求值:获取 k 的当前值(在调用 lol 函数之前为 0),然后将其添加到 lol 函数的结果中。但是编译器证明我错了,w 的值是 10。即使我切换位置来制作它
int w = lol(&k) + k;
结果仍然是 10。我做错了什么?
托梅克
最佳答案
这是因为表达式中的参数未指定以任何特定顺序计算。
编译器可以自由地先执行参数k
或lol(&k)
。该表达式中没有序列点。 这意味着参数的副作用可以按任何顺序执行。
所以简而言之,没有指定代码是打印 5
还是 10
。两者都是有效输出。
bool 表达式中的短路是个异常(exception),因为 &&
和 ||
是序列点。 (见评论)
关于c++ - 表达式评估顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262588/