【发布时间】:2011-06-10 05:33:36
【问题描述】:
此代码取自here 上的讨论。
someInstance.Fun(++k).Gun(10).Sun(k).Tun();
这段代码定义明确吗? Fun() 中的 ++k 是否在 Sun() 中的 k 之前评估?
如果k 是用户定义类型而不是内置类型怎么办?以及上面的函数调用顺序和这个有什么不同:
eat(++k);drink(10);sleep(k);
据我所知,在这两种情况下,在每个函数调用之后都存在一个序列点。如果是这样,那为什么第一种情况不能像第二种情况一样定义明确?
C++ ISO 标准的第 1.9.17 节对序列点和函数求值进行了说明:
调用函数时(无论是 不是函数是内联的),有 评估后的序列点 所有函数参数的(如果有) 在执行之前发生 中的任何表达或陈述 函数体。还有一个 序列点复制后 返回值和 之前 执行外部的任何表达式 函数。
【问题讨论】:
-
程序语言有很多坑和坑,对于一些你不确定的东西,避免它们......也许这个问题可以在 C++ 规范中回答,或者不是......
-
@Nawaz :看来我错了。 @jalf 提出了一个有效的观点。删除我的答案。
-
行为未定义,因为“k 的访问先于它的修改”(不知道我是怎么错过的 :( )。顺便说一句,托尼的代码在 g++、Clang/IntelC++ 上给出了不同的输出。另外我什至得到g++ 上的警告(对 k 的操作可能未定义)。
-
保留您的答案 IMO。我不是 100% 确定我的,所以我认为我们最好让两个答案都可见
-
现在要赶往大学。返回后会单独发布更全面的答案。 :-)
标签: c++ operator-precedence sequence-points