NBeeeeee 发表于 2015-10-18 13:08:23

整型变量a的值为10,b的值为3,则执行表达式b%=b++||++a后的两个变量的值是多少?

整型变量a的值为10,b的值为3,则执行表达式b%=b++||++a后的两个变量的值是多少?   本人没学过C++,帮朋友过来提问的:sweat:

爱你没错 发表于 2015-10-18 13:08:24

本帖最后由 爱你没错 于 2015-10-18 17:54 编辑

b%=b++||++a等价于 b=b%(b++||++a), 按照C语言运算优先级:先算括号里的表达式,括号里的表达式是自加运算符和逻辑或,自加比逻辑高,由于C语言逻辑或跟逻辑与有短路的规定,所以++a会被屏蔽掉,所以结果为真1,逻辑运算运后b自加,所以此时b=4,b=4%1,所以最后 a=10, b=0:

小人 发表于 2015-10-18 13:34:53

a=10 和 b=0
我运行出来的{:9_240:}

NBeeeeee 发表于 2015-10-18 15:21:21

爱你没错 发表于 2015-10-18 13:08
b%=b++||++a等价于 b=(b++||++a)%b 按照C语言运算优先级:先算括号里的表达式,括号里的表达式是自加运算符和 ...

结果是10 和0 你是不是搞错了!!!

y290176346 发表于 2015-10-18 16:22:35

b%=b++||++a

b++结果是3;
++a结果是11;
3||11结果是1   或运算就是两边的值不有一遍不等于0 值就为真,真就是1。
所以b++||++a的结果就是1;
b%=b++||++a就等于b%=1;
%是去余数运算,那么久是b%=1 就等于 b=3%1;b=0;3除以1 余数为0;
a道理来说应该是+1 结果是11我反汇编了下 ,基础知识不好,看不太懂,好像是把++a跳过去了

y290176346 发表于 2015-10-18 16:46:37

本帖最后由 y290176346 于 2015-10-18 16:51 编辑

爱你没错 发表于 2015-10-18 13:08
b%=b++||++a等价于 b=(b++||++a)%b 按照C语言运算优先级:先算括号里的表达式,括号里的表达式是自加运算符和 ...

你的不对 是b=b%(b++||++a);   不信你反汇编看看 b=4%1;

小伪 发表于 2015-10-18 17:31:22

a 的值怎么解释,不论怎么算, a是自加了啊,运算的结果是10,0.不懂,,,,,

爱你没错 发表于 2015-10-18 17:52:28

y290176346 发表于 2015-10-18 16:46
你的不对 是b=b%(b++||++a);   不信你反汇编看看 b=4%1;

嗯是错了,应该是b=b%(b++||++a);由于C语言逻辑或跟逻辑与有短路的规定,所以++a会被屏蔽掉,结果应该是a=10,b=4,b=4%1,谢谢及时提醒,不然要给贴主误会了,真对不起!

爱你没错 发表于 2015-10-18 17:56:05

NBeeeeee 发表于 2015-10-18 15:21
结果是10 和0 你是不是搞错了!!!

对不起,忘记了C语言的逻辑短路规则,谢谢指点

爱你没错 发表于 2015-10-18 17:58:39

小伪 发表于 2015-10-18 17:31
a 的值怎么解释,不论怎么算, a是自加了啊,运算的结果是10,0.不懂,,,,,

C语言逻辑短路----即如果逻辑运算符||左边的表达式为真时右边的表达式就不会参与运算了,同理逻辑运算符&&左边的表达式为假时右边的表达式也不会进行运算了

y290176346 发表于 2015-10-18 21:16:03

爱你没错 发表于 2015-10-18 17:58
C语言逻辑短路----即如果逻辑运算符||左边的表达式为真时右边的表达式就不会参与运算了,同理逻辑运算符 ...

哦你这么一说我也明白点了,怪不得反汇编的时候没看懂,他先对比第一个寄存器就直接跳转到结果了,原来是因为 一地步是真 就不计算右边的了

小伪 发表于 2015-10-19 20:42:57

爱你没错 发表于 2015-10-18 17:58
C语言逻辑短路----即如果逻辑运算符||左边的表达式为真时右边的表达式就不会参与运算了,同理逻辑运算符 ...

谢谢了,,懂了,以后用的时候还真的要小心了。。。。
页: [1]
查看完整版本: 整型变量a的值为10,b的值为3,则执行表达式b%=b++||++a后的两个变量的值是多少?