#include<stdio.h>
int main(){
int a=1,b=2,c=3;
printf("%d,%d,%d,%d\n",a=b=c,a=b==c,a==(b=c),a==(b==c));
a=1,b=2,c=3;
printf("%d\n",a=b=c);
printf("%d\n",a=b==c);
printf("%d\n",a==(b=c));
printf("%d\n",a==(b==c));
return 0;
}
分开输出和连起来输出的值不同
因为printf里的内容是从右向左进行计算的,先计算最右边的a==(b==c) ,此时a=1,b=2,c=3,显然结果为0,返回值为0;然后计算a==(b=c),此时a=1,b=2,c=3,显然结果为0,返回值为0,同时b被赋值为3;然后计算a=b==c,此时a=1,b=3,c=3,执行后a=1,返回值为a(但是注意,这个1并非最终输出结果3,因为返回值a在后面又被改为了3);然后执行最左边的a=b=c,此时,a、b、c均为3,返回值为a;
执行完这一系列后printf内的值相当于printf(("%d,%d,%d,%d\n",a,a,0,0)
而最后一步的时候a被赋值为3,所以printf内的值相当于printf(("%d,%d,%d,%d\n",3,3,0,0)
printf()函数是从后向前从后往前执行
printf("%d,%d,%d,%d\n",a=b=c,a=b==c,a==(b=c),a==(b==c));
是先执行a==(b==c)
再执行a==(b=c)
a=b==c
最后执行a=b=c
printf()函数的参数,在printf()函数读取时是从左往右读取的,然后将读取到的参数放到栈里面去,最后读取到的就放在栈顶,处理参数的时候是从栈顶开始的,所以是从右边开始处理的.--printf()函数的特点.
注意点:
1.printf()函数中的计算是从右向左进行的.
2.我们在写代码时,尽量避免无确定意义的表达式出现,因为不同的编译器,可能会采用不同的理解方式.