有关于大学c语言问题

有关于大学c语言问题第一题
int x=0,y=20,z=30
if(x||(y=50)>z)printf("y=%d",y);
else printf("y=%d",y);
求y的值
第二题
#include<stdio.h>
int main()
{
int i=0,j=0,k=6;
if ((++i>0)||(++j>0)) k++;
printf("%d,%d,%d\n",i,j,k);
return 0;
)
求i,j,k的值

第一题:
int x=0,y=20,z=30

if(x||(y=50)>z)printf("y=%d",y);
//x是0,||是短路径求值的,即如果||的左边已经为true,那么是不会执行右边的表达式的,如果左边表达式是false,则会执行右边的表达式,因此y是50。

else printf("y=%d",y);
求y的值

第二题:
#include<stdio.h>
int main()
{
int i=0,j=0,k=6;
if ((++i>0)||(++j>0)) k++;
printf("%d,%d,%d\n",i,j,k);
return 0;
)
求i,j,k的值
因前++是先对变量+1,然后返回+1后的值,结合上题所述的求值过程,因此++i是执行了,并且由于i变成了1,所以不执行++j,但是k++会执行,所以i=1,j=0,k=7.追问

没懂第一题,if和else有啥区别,都是输出y

追答

出题者只是考察||运算的最短路径求值特性,你可以修改y=1(这样if语句的判定就全部false了),这样else语句就会起作用了,你可以理解成代码的全面性。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-10-20
//第一题
#include <stdio.h>
int main(void)
{
int x=0,y=20,z=30;
if(x||(y=50)>z)
printf("y=%d",y);
else 
printf("y=%d",y);

//如果 if(x||(y=50)>z) 这时候:x=0 , y=50 , z=30
//如果 if(x||(y==50)>z) 这时候:x=0 , y=20 , z=30
return 0;
}


//第二题
#include <stdio.h>
int main()

int i=0,j=0,k=6;
if((++i>0)||(++j>0))
k++;
printf("%d,%d,%d\n",i,j,k); 
//这时候:i=1 , j=0 , k=7 
return 0;
}

追问

不是k++先执行,后自增么?那k应该先输出,后增加吧

追答

因为, printf 是在 k++之后才执行的,所以 k已经是+1成为 7 了。

本回答被提问者采纳
第2个回答  2017-10-20
int x=0,y=20,z=30
if(x||(y=50)>z)printf("y=%d",y);
else printf("y=%d",y);
求y的值
》》》》》》
这里需要注意的是y=50这个是赋值。 所以先赋值y=50, 然后 判断y>z也就是50>30成立。
执行上面一句打印,输出y=50.

#include<stdio.h>
int main()
{
int i=0,j=0,k=6;
if ((++i>0)||(++j>0)) k++;
printf("%d,%d,%d\n",i,j,k);
return 0;
)
》》》》》》
按顺序执行,首先++i>0
由于是前置自加,先自加,再取值。 i自加为1, 判断1>0成立。
于是||的左值为真。 当||左值为真时,整体表达式((++i>0)||(++j>0))必然为真, 所以右值不会参与计算,即++j不会被执行。 这个在C语言中称为短路运算。
表达式为真,执行k++, k值为7.
所以 最终 i=1 j=0 k=7追问

不是k++先执行,后自增么?那k应该先输出,后增加吧

追答

后置自加的先执行,后自增是以语句为单位的。
这里是k++;
到分号语句就结束了, 这时就会进行自加。
等到printf的时候,是自加过的了。

追问

第一题if.else有什么区别,最后都是输出y吧

追答

没区别
题目设置的降低难度了。

第3个回答  2017-10-20
y=50 ,i=1,j=0,k=7