一些问题,大家多帮忙!!

paulxj 2003-05-23 11:00:07
1.
main()
{
int x,y,z;
long m;
y=(x=32767,x-1);
z=m=0xffff;
printf("%d,%d,%d,%ld",x,y,z,m);
}
z和m的结果为什么是-1和65535?

2.
main()
{
int a,b,c;
a=b=c=1;
++a||++b&&++c;
}
的执行顺序是什么?我知道&&先执行,且||前面为1时后面就不执行了,但是否||后面的值为1时前面就不计算呢?

3.
int x=1,y=0;

x-->(y+x)?5:25>y++?'1':'2'

以上语句先执行后面的?:得到'1',y的值变为1,再执行x-->(y+x)?,应该等价于1>1,其值为假,应该得到'1',可答案却是5,这是为什么?

4.
x=3;
do{
y=x--;
if(!y) {printf("x"); continue;}
printf("#");
}
while(1<=x<=2);

在哪是死循环?

4.
#include<stdio.h>
main()
{
int i,b,k=0;
for(i=1;i<=5;i++)
{b=i%2;
while(b-->0) k++;
}
printf("\n%d,%d",k,b);
}

这段程序我运行的结果是3,-1,而答案是8,-2,哪个是对的?
...全文
207 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
snipersu 2003-05-24
  • 打赏
  • 举报
回复
z和m的结果为什么是-1和65535?你用的int是16位的.
但是否||后面的值为1时前面就不计算呢?先计算前面的如果前面的为1就不计算后边的.编译器不同可能不同.也许从后向前.
3.懒的看了^_^和编译器有关.
while(1<=x<=2);这个是死的.
这段程序我运行的结果是3,-1,而答案是8,-2,哪个是对的?都对编译器的不同.
fullsail 2003-05-24
  • 打赏
  • 举报
回复
写错一个地方,逻辑计算的顺序是从左到右。
fullsail 2003-05-24
  • 打赏
  • 举报
回复
1.
main()
{
int x,y,z;
long m;
y=(x=32767,x-1);
z=m=0xffff;
printf("%d,%d,%d,%ld",x,y,z,m);
}
答复:
long型的定义一般是unsigned int;你的int 是16Bits.

2.
main()
{
int a,b,c;
a=b=c=1;
++a||++b&&++c;
}
答复:
在新的编译器里面“++a||++b&&++c;”这样的语句一般会被优化掉,什么也不执行。呵呵。
如果没有优化掉,你就问执行顺序:逻辑计算的顺序是从右到左,
A、exp1 && exp2
B、exp1 || exp2
A、中如果exp1 为fasle,exp2不计算
B、中如果exp1 为true,exp2不计算.
对于看不懂的语句最好的方法是加括号。++a||++b&&++c;=(++a||(++b&&++c));现在你明白了++a会运行了。++a=2为真,所以后面的++b&&++c不计算。所以a=2.b=1,c=1

3.
int x=1,y=0;
x-->(y+x)?5:25>y++?'1':'2'

答复:答案是5????我怀疑。我认为是‘1’。
int z =x-->(y+x)?5:25>y++?'1':'2';
我改为试验的结果也是如此。答案是49字符'1'。还是加括号。你为什么认为先计算后面的?
((x-->(y+x)?5:25)>y++?'1':'2')。先计算的应该是((x-->(y+x)?5:25),结果是25,大于y++.所以结果是'1'。我相信现在的编译器这个结果应该相同。


4.
x=3;
do{
y=x--;
if(!y) {printf("x"); continue;}
printf("#");
}
while(1<=x<=2);

在哪是死循环?
答复:x<=2; y=3;while(1<=x<=2)恒定为真,我不敢肯定,我认为是这样的,表达式运算都是从右到左。x<=2恒定为为ture,也就是1。1<=1当然也恒定为真。

4.
#include<stdio.h>
main()
{
int i,b,k=0;
for(i=1;i<=5;i++)
{b=i%2;
while(b-->0) k++;
}
printf("\n%d,%d",k,b);
}
答案就应该是3,-1.什么书说是8,-2?另外:如果你的书上全部都将这些问题,你还是扔了把。呵呵。

我最后用两个编译器(GCC,(对C++标准支持最好),VC++.NET)验证了我的答案。没有问题。

编译器的确有差异。和ASNI C++标准都有一定的距离。但你这些问题都很简单,现在的编译器应该不会发生差异(差异远比大家想象的少,通过中间层完全可以屏蔽,甚至可以跨越Win32和UNIX)。VC++原来是编译器中最混乱的(其实IBM的更烂)。但现在VC++.NET基本没有大问题。对这样的问题不要总说编译器问题,这大部分都是C++很简单的常识。虽然我也认为无聊的成分居多。

祝好运。

boylez 2003-05-24
  • 打赏
  • 举报
回复
65535和-1在某些时候是一样的,
同意楼上的说法!!!

69,382

社区成员

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

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