《C程序设计第二版》(谭浩强)
如果实参表列包括多个实参,对实参求值的顺序并不是确定的,有的系统按自左至右顺序求实参的值,有的系统则按自右至左顺序。许多C版本(例如Turbo C和MS C)是按自右而左的顺序求值。例:
int f(int a, int b);
void main()
{
int i = 2;
int p;
p = f(i, ++i)
}
如果按自左至右顺序求实参的值,则函数调用相当于f(2, 3)。若按自右至左顺序求实参值,则它相当于f(3, 3)。可以在不同的环境中试一试, 就可知所用系统的处理方法。由于存在上述情况,使程序通用性受到影响。因此应避免这种容易引起不同理解的情况。
如果本意是按自右而左顺序求实参的值,可以改写为
j = i;
k = ++i;
p = f(j, k);
如果本意是按自左而右顺序求实参的值,可以改写为
j = ++i;
p = f(j, j);
这种情况在printf函数中也同样存在,如
printf("%d, %d", i, i++);
也发生上述同样的问题,使用时应注意,避免使用这种容易混淆的用法。
评论