分割函数参数的逗号并不是逗号运算符,因此其求值顺序是未定义,不确定的。
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];
逗号运算符的求值顺序是从左到右。
分割函数参数的逗号并不是逗号运算符,因此其求值顺序是未定义,不确定的。例如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];
相关文章推荐
- C++编程规范之31:不要编写依赖于函数参数求值顺序的代码
- 注意:C语言中没有指定同一运算符的多个操作数或者某函数各个参数的求值顺序,如果代码的执行结果和求值顺序有关,都是不好的程序设计风格。
- 函数参数求值顺序和默认值
- 【C】没有注意系统对函数参数的求值顺序的处理方法
- 实现函数 functionFunction,调用之后满足如下条件: 1、返回值为一个函数 f 2、调用返回的函数 f,返回值为按照调用顺序的参数拼接,拼接字符为英文逗号加一个空格,即 ', ' 3、所
- C语言中函数参数的入栈顺序
- mybatis 按in 函数参数顺序排序
- printf函数的求值顺序问题
- 当用数组名作函数参数时,情况则不同。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之
- 带变长参数函数的数学表达式求值类[附加参数赋值]
- C语言函数调用时参数压栈的顺序以及函数指针的作用
- C语言函数入栈顺序与可变参数函数
- 编程经验点滴(二)——《C、C++中函数调用时参数压栈的顺序问题》
- 输入a和b两个整数,按先大后小的顺序输出a和b(指针变量作为函数参数)
- Python基础04--函数参数顺序
- 4、对变量在栈上存储顺序,及函数返回值与参数在栈上存放顺序的思考(2)
- C语言中函数参数的入栈顺序
- C语言中函数参数入栈的顺序
- C语言中函数参数的入栈顺序
- ES3和ES5关于计算顺序的问题(ES5先计算函数ES3则是参数)