例8.4
main()
{int i=2,p;
p=f(i,++i); /* 函数调用 */
printf("%d",p);
}
int f(int a,int b) /* 函数定义 */
{int c;
if(a>b) c=1;
else if(a==b) c=0;
else c=-1;
return(c);
}
在Turbo C系统上运行的结果如下:
0
如果按自左至右顺序求实参的值,则函数调用相当于f(2,3),程序运行应得结果为“-1”。若按自右至左顺序求实参的值,则它相当于f(3,3),程序运行结果为“0”。读者可以在所用的计算机系统上试一下,以便知道它所处理的方法。由于存在上述情况,使程序通用性受到影响。因此应当避免这种容易引起不同理解的情况。如果本意是按自左而右顺序求实参的值,可以改写为
j=i;
k=++i;
p=f(j,k);
如果本意是自右而左求实参的值,可改写为
j=++i;
p=f(j,j);
这种情况在printf函数中也同样存在,如
printf("%d,%d",i,i++);
也发生上述同样的问题,若i的原值为3,在Turbo C上运行结果为4,3。请读者务必注意,应该避免这种容易混淆的用法。
main()
{int i=2,p;
p=f(i,++i); /* 函数调用 */
printf("%d",p);
}
int f(int a,int b) /* 函数定义 */
{int c;
if(a>b) c=1;
else if(a==b) c=0;
else c=-1;
return(c);
}
在Turbo C系统上运行的结果如下:
0
如果按自左至右顺序求实参的值,则函数调用相当于f(2,3),程序运行应得结果为“-1”。若按自右至左顺序求实参的值,则它相当于f(3,3),程序运行结果为“0”。读者可以在所用的计算机系统上试一下,以便知道它所处理的方法。由于存在上述情况,使程序通用性受到影响。因此应当避免这种容易引起不同理解的情况。如果本意是按自左而右顺序求实参的值,可以改写为
j=i;
k=++i;
p=f(j,k);
如果本意是自右而左求实参的值,可改写为
j=++i;
p=f(j,j);
这种情况在printf函数中也同样存在,如
printf("%d,%d",i,i++);
也发生上述同样的问题,若i的原值为3,在Turbo C上运行结果为4,3。请读者务必注意,应该避免这种容易混淆的用法。