re: 初来乍到 50米 2005-12-26 15:04
呵呵顺序点的情况估计不少人都没有听过吧,^_^托大了呵呵:)
下面举例说明吧呵呵。
int m=1;
int n;
n=m++ + m++;
请回答结果是多少?
正确回答是:不知道!语言没有规定它应该算出什么,结果完全依赖具体系统在具体上下文中的具体处理。其中牵涉到运算对象的求值顺序和变量修改的实现时刻问题
a = 4; cout << a++ << a;
这种东西根本不该写,讨论其效果没有意义。
我们知道它是
(cout.operator <<(a++)).operator << (a);
的简写。先看外层函数调用,这里需要算出所用函数(由加下划线的一段得到),还需要计算a 的值。语言没有规定哪个先算。如果真的先算函数,这一计算中出现了另一次函数调用,在被调函数体执行前有一个顺序点,那时a++ 的副作用就会实现。如果是先算参数,求出a 的值4,而后计算函数时的副作用当然不会改变它(这种情况下输出两个4 )。当然,这些只是假设,实际应该说的是:这种东西根本不该写,讨论其效果没有意义。
程序语言通常都规定了执行中变量修改的最晚实现时刻(称为顺序点、序点或执行点)。程序执行中存在一系列顺序点(时刻),语言保证一旦执行到达一个顺序点,在此之前发生的所有修改(副作用)都必须实现(必须反应到随后对同一存储位置的访问中),在此之后的所有修改都还没有发生。在顺序点之间则没有任何保证。对C/C++ 语言这类允许表达式有副作用的语言,顺序点的概念特别重要。