谭浩强老师C语言教材里的几个问题,在这里请教一下,希望大家帮忙!

enewcentury 2005-09-05 05:51:00
1)
int a,b,c;
a=b=c=1;
++a||++b&&++c
后,a的值是2,b的值是1,为什么?

2)
#include<stdio.h>
mian()
{
int i,b,k=0;
for(i=1;i<=5;i++)
{
b=i%2;
while(b-->=0) k++;
}
printf("%d,%d",k,b);
}
程序的运行结果是8,-2,搞不懂过程,怎么算出来的?

3)
为什么此程序段是死循环
for(i=1; ; ) if(++i<10) continue;


4)
#include<stdio.h>
main()
{
int i;
for(i=1;i<=5;i++)
{ if(i%2) printf("*");
else continue;
printf("#");
}
printf("$\n");
}
此程序的运行结果是*#*#*#$,为什么?
...全文
85 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouhuahai 2005-09-05
  • 打赏
  • 举报
回复
刚刚查了一下,的确是&&的优先级更高,谢谢楼上指正.
snowbirdfly 2005-09-05
  • 打赏
  • 举报
回复
对于问题2:
2)
int i,b,k=0;
for(i=1;i<=5;i++)
{
b=i%2;
while(b-->=0) k++;
}
执行过程如下:
i = 1;b = 1;k = 2;
i = 2;b = 0;k = 3;
i = 3;b = 1;k = 5;
i = 4;b = 0;k = 6;
i = 5;b = 1;k = 8; 由于while(b-->=0) k++;运行了3次,所以b = -2;(b = 1,b = 0执行循环体;b = -1跳出循环)
enewcentury 2005-09-05
  • 打赏
  • 举报
回复
好了,谢谢,结贴!
snowbirdfly 2005-09-05
  • 打赏
  • 举报
回复
对于第一个问题:
++a||++b&&++c
这样的逻辑运算,首先a = 1;++a则a = 2;
但是由于&&优先于||则是看++a||++b,
对于++a||++b中首先++a为2则++a||++b必为1,
下面在看++c,同时也为2,最后++a||++b&&++c为1(为真)
zhouhuahai 2005-09-05
  • 打赏
  • 举报
回复
1)
int a,b,c;
a=b=c=1;
++a||++b&&++c
后,a的值是2,b的值是1,为什么?

先做++a运算,所以a的值是2,而编译器在这里时就可以确定整个表达式的值为1了,故把后面的计算优化掉了,并没计算++b&&++c

2.
int i,b,k=0;
for(i=1;i<=5;i++)
{
b=i%2;
while(b-->=0) k++;
}

i=1 时, b=1, while进行了2次,k=2
i=2时, b=0, while进行了一次,k=3
i=3时, b=1, while进行了2次,k=5
i=4时, b=0, while进行了一次,k=6
i=5时, b=1, while进行了2次,k=8 ,但是b--进行了三次,也就是while的判断进行了三次!最后
b = -2!



3)
为什么此程序段是死循环
for(i=1; ; ) if(++i<10) continue;
这里i的值一直没有变化,所以i一直是1

4.
for(i=1;i<=5;i++)
{ if(i%2) printf("*");
else continue;
printf("#");
}
printf("$\n");
}
此程序的运行结果是*#*#*#$,为什么?
if(i%2) printf("*"); //这里如果i是奇数,则打印一个'*',且接下来再打印一个'#'
else continue; //如果是偶数,则跳出本次循环,进入下一次.
printf("#"); //且接下来再打印一个'#'
从1到5,共有三个奇数:1 3 5,故打印三次*#, 加上最后一个$,故结果为*#*#*#$

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧