main() {int a=10,b=20,c=30,d; d=++a<=10||b-->=20||c++; printf("%d,%d,%d,%d尀n",a,b,c,d); }

C++初学,各位大大帮忙求结果,求解释,谢谢了!
2024-12-04 11:26:03
推荐回答(4个)
回答1:

最后结果: 11,19,30,1
原因:
d=++a<=10||b-->=20||c++;
根据优先级加上括号就成了这样
d=(((++a) <= 10) || ((b--)>=20)) || (c++);
首先C的逻辑或运算时有个短路计算的规则,即||左边为真时不会进行右边的计算。
((++a) <= 10): ++a,+号在左边,先自增再比较,所以 a=11, 11<=10为假,进行b的运算。
((b--)>=20)) : b--,减号在右边,先比较再自减,所以比较时b=20,20>=20成立,比较完成后进行b的自减运算,完成时b=19,此时(((++a) <= 10) || ((b--)>=20)) 的值为真,不再进行c的运算。所以c的值不会变c=30,d为真即d=1

回答2:

main()
{ int a=10,b=20,c=30,d;
d=++a<=10||b-->=20||c++; //先要搞清楚运算符的优先级问题,才好做,在这里优先级最高的是++和--,然后是<=,>=,再后是||,所以结果是11,19,30,1。这里的c之所以等1,是因为(((++a) <= 10) || ((b--)>=20)) 的结果已经为真了,而||的运算规则是一真为真,否则为假,显然这已经为真了,所以c++也就不用计算了。
printf("%d,%d,%d,%d\n",a,b,c,d);
}

回答3:

1、先给你说一下||的执行原理,就是++a<=10||b-->=20||c++这几句话,如果d=++a<=10为真,则后面的都不会执行,++a<=10为假,b-->=20为真,则c++不会执行,如果为假,则c++才执行。
2、a=11;因为++a,自增运算符,++在左边,所以先自增,即10+1=11;
3、b=19;因为++a<=10为假,所以执行第二个条件语句,b--,自减运算符,--在右边,所以先 判断是否b>=20,然后再自减,因为b初值为20,所以条件为真,然后b=20-1=19;
4、c=30;因为我说了第二个条件为真,就不执行第三个条件语句,所以c++不执行,及c仍然为 30;
4、d=1;因为条件语句最后为真,所以为true,则为1

回答4:

首先你要知道运算符是有优先级的,参考下边的链接,“++”、“--”优于“<=、>=”优于“||”优于“=”,
因此
先算++a,a=11,大于10,第一个“||”运算之前的值为0;
b=20,满足条件,两个“||”之间的值为1,然后b--,b=19;
c++,c=31,最后“||“之后的部分返回的值为31>0,你要知道逻辑算符里只有”真“和”假“,”0“是假,非”0“是真,因此,返回的虽然是31,但是不是0,其实真正返回的就是1(真);
或的运算是都为0则结果为0,有一个1则结果为1,因此,d=1。
上边貌似没有说到前置++、--和后置++、--,其实很简单,前置就是先将值加1或者减1再将这个值拿到后边去运算,如a的运算过程;后置就是将值先赋给其他运算,如果有的话,算完后再自加1或者减1,如b的运算过程,先赋值20给”>=20“进行逻辑运算,再自减1。
希望你学得愉快!

刚没看楼上,忘记”短路计算“,确实如楼上所说,c值不变为30