有两个C语言的题目,要详细讲解过程

来源:百度知道 编辑:UC知道 时间:2024/05/15 01:28:57
小弟刚学C语言,有很多不懂之处,请高手帮忙
1.下列程序
int i,a=3,b=2;
i=(--a==b++)?--a:++b;
printf("i=%d a=%d b=%d,i,a,b);输出结果是__________
2下列程序
void main()
{
int a=3,b=4,c=2,d;
d=a<!b&&(c=50)>b;
printf("d=%d c=%d,d,c);
}
输出结果是__________

,要详细讲解过程

1.如果不看程序语法,只看算法,应该是:
i=1 a=1 b=3

i=(--a==b++)?--a:++b;
这一句中,如果 (--a==b++)成立,i的值将会是--a,否则是++b
由于--a==2(a的值改变为2),b++==2(b的值改变为3),所以(--a==b++)成立,于是i的值将改变为--a,由于此前a的值是2,所以执行这条语句之后,i的值将和a一样改变为1,而b的值是3,所以有以上输出。

如果考虑程序的语法,那么这个程序不会有输出,因为printf("i=%d a=%d b=%d,i,a,b);中少了引号。

2.如果不看程序语法,只看算法,应该是:
d=0 c=2

在d=a<!b&&(c=50)>b; 中由于=的结合性是从右向左的,而且,等号的优先级低于<、!、>、()以及&&,所以计算将从=右边开始。

由于b的值为4(非0),所以!b的值为0,又由于a的值为3所以a<!b不成立,由于&&的短路求值作用,&&的右边的部分将不再运算,因此a<!b&&(c=50)>b的值是0,也就是说d的值是0,由于&&的右边的部分没有进行运算,所以c的值并未改变,于是得到上述结果。

如果考虑程序的语法,那么这个程序不会有输出,因为printf("d=%d c=%d,d,c); 中少了引号。

1.
int i,a=3,b=2; //该处定义了三个变量,并给a赋值3,b赋值2
i=(--a==b )?--a: b; //该行关键用到了(判断式)?表达式1:表达式2;它的功能是实现判断语句,如果判断式为真则执行表达式1,否则执行表达式2;--a表示参与操作前先自减,b 表示操作后再自增;因此--a==b 此时为 --3==2 为真,所以执行--a; a=1,因其自减两次,b=3,因其参与操作后要自增一次;i=--a=1,printf("i=%d a=%d b=%d,i,a,b);//答案为:1,1,3
2
void main()
{ int