请高手帮忙分析一下

2025-02-05 16:39:20
推荐回答(4个)
回答1:

不同的编译器对你写的这个代码产生的结果不一样。
比如VC6.0和VC2008,如果你用TC,那么可能结果和前面2种编译器都不一样。
所以:你这个代码没有任何意义,研究这种代码也无任何意义。
原因:不同编译器对自增运算符的处理不一样。
但有一点是一样的,将自增运算符作为一条单独的语句,明确的使用。
但是你的题目我还是可以帮你解释一下:
首先你要明白printf的参数传递规则是 :右-->坐。其次你要明白连续的&&运算符,当第一次遇到0以后,由于优化,后面的代码将不再执行。
第一条printf语句运行结束后 a=1;b=-1;c=0;这个你说懂了,我看未必,继续看下面。。。
第二条printf语句运行介绍后 a=2,b=-2,c=1 ,这个你没意见把。(第二条printf语句最先运行的是最右边参数)。
回头来看第一句printf,我将它换成:printf("a=%d,b=%d,c=%d,e=%d\n",a,b,c,++a&&b--&&++c);
自己注意看区别,这2句话效果相等,但有助你理解。虽然第一句printf的自加操作在参数的最左边,但是当函数计算e的值的时候,导致了a,b的值发生变化。

至于你的程序执行的结果,不知道你用何编译器,无法解释。研究这种问题,实在是没有必要,因为正规的代码不会出现你那种,稍微了解一点就算了吧。

回答2:

上面已经输出a=1,b=-1 了,下面的printf先计算++a和b--,自然就是2和-2了

回答3:

++a其实就是a=a+1;有两次++a;a就从0到2了。一行一次运行完,行内不分先后的。
同理,两次--b。

回答4:

当输入0,0,0时
printf("e=%d,a=%d,b=%d,c=%d\n",++a&&b--&&++c,a,b,c);
printf("a=%d,b=%d,c=%d,e=%d\n",a,b,c,++a&&b--&&++c);

我觉得结果为e=0,a=0,b=0,c=0
a=2,b=-2,c=1,e=1

因为:
1、printf()函数执行顺序 自右向左
2、"&&"前的条件判断结果为false,不再执行"&&"后的语句块。"&&"前为true则继续进行进行后半部分的判断