1、有int a=3,b=4,c=5;则表达式a||b+c&&b==c的值为(1),为什么?2、以下程序运行结果为(1、0)?main(){int x,y,z;x=1;y=1;z=0;x=x||y&&z;printf("%d,%d",x,x&&!y||z);}
热心网友
楼上几位的说法都是有错的。main(){int a=3,b=2,c=1;int i;i=a||b++&&c++; /*为了说明一个问题我改了表达式,但是与原来表达式还是差不多的。*/printf("i=%d",i);printf("\n b=%d,c=%d",b,c);}看看b,c输出的值,还是2,1,就是说a||的后面实际上没有运算。在C语言有这样的一个例子,a||b,a如果是1(即大于0为真)的话,1或任何数都为1,所以后面是就不运算了(如果a为假,后面就要运算)。a&&b,与里面也有一个相同的,如果a为0,0与任何数都为0,所以这种情况下与的右边也不运算。就像上面的的例子i=a||b++&&C++; 又如 i=a||(b=b+7)||(a=a+4);输出a和b看看值,就知道后面没运算。所以0(即表达式值为假)&&任何值/表达式都为0,1(即表达式值为真)||任何表达式/值都为1,这个在运算表达式里就注意有这两个情况,因为它后面不运算的。C语言表达式的题很喜欢出这类的,因为在这道题从表面上从优先级考虑你肯定要把所有的表达计算。说了这么多,来看你的第二题,其实第二题也是有这种情况的。main(){int x,y,z;x=1;y=1;z=0;x=x||y&&z; /*这里x=1,x为真,像前面说或的一种情况。||的右边就不会运 算(当然在这道题即使后面运算也不会影响这里的结果,但是 要清楚TC到底是在做什么,结果一样,但想法是不正确的*/printf("%d,%d",x,x&&!y||z);/*这里,x为真,如前面所说,如果x为0即为条 件假的情况后面是不运算,肯定为假了。这里 x为真,整个运算就要进行上。!y=0,!的运算级高先运算,然后它与X&&,得0,0与Z||自然就得0,结果为0。注意如果与Z之前与X&&得的是1即真的话(即初始化改y的值为0,!y就为1(真)),那么用前面的说过的情况1(真)||任何值或表达式都为真,||后面不会运算。 }。
热心网友
楼上的朋友,就第一题来说,我认为应该先算b+c,因为算术运算符的级别高,你说呢?
热心网友
1.当然是等于1了,注意这里的1表示"是",如果出现0表示"否",因为这个是逻辑运算符号,我们来分析一下吧.&&表示逻辑和,就是&&左右两边的表达式都要成立才是"1",那你看b=4,c=5,显然b不会等于c,所以显然右边的(c&&b==c)这个表达式的值是0.再来看a||b,表示a或者b,这样计算结果是1,所以整个式子的值就是1+0=1,所以是1啊.2.我们继续分析,有了上面题目的经验我们可以很快知道x||y&&z一定是1,然后把1的值赋予x,所以x就是1,所以第一个1是这样来的.关于第二个0,由于!的优先级别要大于||,,!y=0,!y||z这个表达式就是0了,由于x是1,!y||z是0,进行合并运算&&两边表达式结果不一样所以结果自然就是0了.第一次在网络上分析C程序,呵呵这个题目不清楚的话再说吧.