有关与逻辑运算符问题
本帖最后由 tyf1218405122 于 2022-5-25 21:16 编辑有个问题就是:
对于像这样的 表达式 :++a||++b&&++c ;
++a||(++b&&++c);
这两个表达式的执行顺序是什么样的;
逻辑运算符 && 的优先级是比 || 要高的,
按照优先级来说是先执行后面的;
但是按照序列点来说应该是先执行前面的;
还有第二个表达式加了括号,又是怎么样的一种情况呢?
在编译器中实验的是 都是从左往右顺序执行,没有按照优先级(无论有没有加括号);
你是怎么实验的? 这种东西不同编译器是不一样的,不建议这么写 jhq999 发表于 2022-5-25 22:50
这种东西不同编译器是不一样的,不建议这么写
但是有笔试,所以要弄清楚这个.
本帖最后由 jhq999 于 2022-5-26 16:32 编辑
tyf1218405122 发表于 2022-5-26 16:00
但是有笔试,所以要弄清楚这个.
拿这个举例++a||++b&&++c ;
int main()
{
int a=0,b=0,c=0;
if (++a||++b&&++c )
{
}
printf("%d %d %d",a,b,c);
return 0;
}
结果
1 0 0
vs2012反汇编
102: if (++a||++b&&++c )
00DD38C3 8B 45 F8 mov eax,dword ptr
00DD38C6 83 C0 01 add eax,1
00DD38C9 89 45 F8 mov dword ptr ,eax
00DD38CC 75 14 jne main+52h (0DD38E2h) ;;;;这里只要a为真,直接跳转根本不执行 ++b&&++c,有的编译器就从右到左先c=1然后b=1,b&&c=true,就不执行++a,结果是0 1 1
00DD38CE 8B 45 EC mov eax,dword ptr
00DD38D1 83 C0 01 add eax,1
00DD38D4 89 45 EC mov dword ptr ,eax
00DD38D7 74 09 je main+52h (0DD38E2h)
00DD38D9 8B 45 E0 mov eax,dword ptr
00DD38DC 83 C0 01 add eax,1
00DD38DF 89 45 E0 mov dword ptr ,eax
页:
[1]