c++ - 表达式评估顺序

标签 c++

我最近对以下 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。我做错了什么?

托梅克

最佳答案

这是因为表达式中的参数指定以任何特定顺序计算。

编译器可以自由地先执行参数klol(&k)。该表达式中没有序列点。 这意味着参数的副作用可以按任何顺序执行。

所以简而言之,没有指定代码是打印 5 还是 10。两者都是有效输出。

bool 表达式中的短路是个异常(exception),因为 &&|| 是序列点。 (见评论)

关于c++ - 表达式评估顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262588/

相关文章:

c++ - 是否有 `__FILE__` 的广泛可用的宽字符变体?

c++ - 为什么这个互斥代码没有按预期工作?

c++ - Boost Libraries 的使用和优于其他库的优势

c++ - 模板问题 ('typename' 因为不是模板函数参数)

c++ - 缺少 'printout' CLIPS 的函数声明

c++ - QGraphicsView/Scene - 多线程噩梦

c++ - 从 calloc() 迁移到 new

c++ - 由于头文件中的语法错误导致编译错误

c++ - 如何隔离只允许创建为单例的不良行为 3rd-party c-lib?

c++ - 如果复合表达式中的多个操作数修改同一个对象,它是未定义的行为吗?