为什么。。。。。。。。。

#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.我们在写代码时,尽量避免无确定意义的表达式出现,因为不同的编译器,可能会采用不同的理解方式.