您的位置:首页 > 其它

分割函数参数的逗号并不是逗号运算符,因此其求值顺序是未定义,不确定的。

2008-09-24 19:33 239 查看
from 《Essential C++》
逗号运算符的求值顺序是从左到右。
分割函数参数的逗号并不是逗号运算符,因此其求值顺序是未定义,不确定的。例如f(x, y); 不能保证其中x, y求值的先后。而g((x, y)); 的参数只有一个(x, y),这是一个逗号表达式,表达式的值就是y的值。同样的:
int x = f1() + f2();
中,对f1与f2调用的先后顺序也是不确定的。
下面这种从数组x中复制前n个元素到数组y中的做法是不正确的,因为它对求值顺序作了太多的假设:
while (i < n)
y[i] =x [i++];
问题出在哪里呢?上面的代码假设y[i]的地址将在l的自增操作执行之前被求值,这一点并没有任何保证!在C语言的某些实现上,有可能在自增之前被求值;而在另外一些实现上,有可能与此相反。同样道理,下面这种版本的写法与前类似,也不正确:
while (i < n)
y[i++]=x[i];
另一方面,下面这种写法却能正确工作:
while (i < n) {
y[i] = x[i];
i++;
}
当然,这种写法可以简写为:
for (i=0; i<n; i++)
y[i] = x[i];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐