求高手为我解答C语言的疑问,谢谢

有两个程序:1 int a=-1,b=4,k; k=(a++<=0)&&(!b--<=0);
printf("%d,%d,%d",k,a,b);
答案里的输出结果是1,0,3
我觉得k=(a++<=0)&&(!b--<=0);只是判断的语句,a和b的值应该不会变化,我觉得答案应该是1,-1,4。
2 int a=2,b=3,c=4,d=5; int m=2,n=2;
a=(m=a>b)&&(n=c>d)+5;
printf("%d",n);
答案是 2 但我觉得c>d为假,值为0,赋值给了n,结果应该是0
请高手解答我的疑惑,谢谢了。回答好的话,我还会给你加分

在执行的时候,编译器已经通过运算了,a的地址存放的-1自然被改掉了,(如果再做运算的话,其值不变,例如++(a++),它只做一次自加一运算)。 !的优先级比<=高,--的优先级比!高,b--为3=true,所以!b--为false=0,所以后面部分为真,整句话为真,所以k=1,而a已经变化为1,b=3。
第二题:C里面有一个预编译机制,就是说&&这个操作,如果前面的为false,那么肯定为假,下面的部分它就不看了,自然不做运算,题目中a=0=false,所以后面就不做运算,自然任然时2!。
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-06-02
第一题:先进行增1或减1运算再判断大小,答案没错
第二题:答案也没错,因为a>b为假,所以m=0
当"&&"左边为0时,电脑就不会再算右边了,既n=c>d没有被运算
所以n还是为2。
第2个回答  2008-06-02
00401612 mov edx,dword ptr [a]
00401615 mov eax,dword ptr [a]
00401618 add eax,1
0040161B mov dword ptr [a],eax
0040161E test edx,edx
00401620 jg main+0F1h (00401651)
00401622 mov ecx,dword ptr [b]
00401625 mov edx,dword ptr [b]
00401628 sub edx,1
0040162B mov dword ptr [b],edx
0040162E test ecx,ecx
00401630 jne main+0DBh (0040163b)
00401632 mov dword ptr [ebp-24h],1
00401639 jmp main+0E2h (00401642)
0040163B mov dword ptr [ebp-24h],0
00401642 cmp dword ptr [ebp-24h],0
00401646 jg main+0F1h (00401651)
00401648 mov dword ptr [ebp-28h],1
0040164F jmp main+0F8h (00401658)
00401651 mov dword ptr [ebp-28h],0
00401658 mov eax,dword ptr [ebp-28h]
0040165B mov dword ptr [k],eax

上面是k=(a++<=0)&&(!b--<=0) 的汇编代码,不同的编译器可能会有不同的结果。
前4行是对a进行了加1操作,7到10行是对b进行了减1操作;此时a=0,b=3,!b=0,所以k=1

2、C语言里对逻辑运算进行了优化,对于&&来说,如果第一个操作数为假,就没有必要再运算了
第3个回答  2008-06-02
我用简单易懂的语言来解释吧:
1.因括号运算级最高,先算括号里的。a<0和!b--<=0都成立,故k=1;
然后,a加一,b减一,从而得出结果。
2.因为a>b为假,所以m=0 ,0&& 此时产生短路,即不再计算&&后面的式子,故n未被赋予新值,故仍为2.

C语言菜鸟求高手解答...
1. 第一个问题似乎是一个关于C语言条件判断的疑问。你需要明确表达你的问题,以便得到具体的解答。2. 在C语言中,`m++` 表示先使用变量 `m` 的值,然后将 `m` 的值加1。所以,表达式 `m++ > 5` 首先将 `m` 的值(初始为5)用于比较,然后 `m` 自增。3. 由于 `m` 的初始值是5,...

C语言中的问题不明白为什么 新人麻烦详细解释一下谢谢
scanf不指定分隔符时,默认以空白字符(空格、回车、制表符)为分隔符。PS:如果写%d%c不指定分隔符号。由于第二个变量是字符型,输入时中间不要加空格符,否则会将空白符号做为字符接收。

关于C语言编写程序的一个疑问 高手帮忙看看我的程序哪错了
看了你的代码觉得,你在C语言的语法规则上还有待提高啊,在此举出你所给出的代码的若干错误。首先,你的代码不完整。第9、11、13行要定义三个100行的二维字符数组,如果仅仅是类似char adj[100][12]={"开心的"}的定义;这样adj[1]到adj[99]这99个词都会是空值(ASCII码为0),若用printf()函...

C语言运行结果的疑问
你这里的c=a%d我不知道是什么结果,是不是写错了?是不是c=a%b,那样c=1;p+=3;表示把p的首地址往后移3位,那么p的首地址就对应到"%d,a=%d,b=%d\\n"这里面的'a'printf(p,c,a,b);把p带入里面就是 printf("a=%d,b=%d\\n",c,a,b);这样结果会自动把b忽略,显示的结果就是a=...

新手求教关于C语言的数组与指针问题!求高手!
你的疑问非常有理!这题就是胡扯谈,A还能占上边,其它全不占边。题目是“指向数组指针pt的是”——这话都没说清楚,这选项中哪有“指向指针pt”的标识符?可能是想说“指向数组的指针pt是”,那就是A了……B——把数组pt的下标为5的元素强制为int *型指针,这错得太多。C——声明pt是有5个...

c语言入门编程,但编译运行完没有显示任何东西,不清楚哪出问题了,求大神...
有个疑问,楼主你这个能过编译吗(我也是刚学完c基础)?下面说说我发现的几点问题:1、char 型的字符数组应该用单引号将内部元素包起来=>char str[]={'1','2','3','4'};(至少我学到的是这样)2、你的指针用的好像有点问题,具体错误怎么改我不记得了,这个有点抱歉 3、printf("%d\\n",...

关于C标准疑问,求解答
1.C语言的国际标准只有2个,分别是ISO 9899:1990和ISO 9899:1999,也就是常说的C89和C99,POSIX和Single UNIX Specification是操作系统标准,不是C语言标准。2.大部分项目依然使用的是C89,各个公司对C99的支持所表现出来的兴趣不同。当GCC和其它一些商业编译器支持C99的大部分特性的时候,微软和...

C语言中实型常量习题疑问求大神帮助
常量的表示性式有两种 1、十进制数形式,它由数字和小数点组成,必须有小数点 第一道 因为C 包含有了* 所以 是错误的 这就不是一个数值了 而是1个表达式了, 2、指数形式,指数形式e前面的数必须大于1 所以 B 不对 追问: 那第一道的B呢?? 回答: 我觉得B 也是对的 ,...

请教大家一个c语言中的问题?这个问题已经困扰我很久了。题目如下:_百 ...
首先你要明确这样一个问题。在C语言中,变量是有生命周期和作用域的(链接类型暂时不提)生命周期,指变量对程序可见的范围 作用域,指变量对程序可修改的范围 注意:有生命周期的变量不一定有作用域(也就是说,可以访问的变量不一定全是可修改的)另外你应该知道,C语言函数只能按值传参,而且形参被...

关于C语言的一个疑问
C.b=a-(- -a)首先运行--a,即a-1,a变为2 接着运行a-a,b=0 D. b=(a++)%3 首先运行a%3,b=0 接着运行a++,a=4 ++和-- 写在变量前是先自加或自减再运算 写在变量后是先运算再自加或自减

相似回答
大家正在搜