tyf1218405122 发表于 2022-5-25 21:15:12

有关与逻辑运算符问题

本帖最后由 tyf1218405122 于 2022-5-25 21:16 编辑

有个问题就是:
对于像这样的 表达式 :++a||++b&&++c ;
                                  ++a||(++b&&++c);

这两个表达式的执行顺序是什么样的;
逻辑运算符    &&    的优先级是比   ||    要高的,
       
        按照优先级来说是先执行后面的;
        但是按照序列点来说应该是先执行前面的;
还有第二个表达式加了括号,又是怎么样的一种情况呢?


在编译器中实验的是   都是从左往右顺序执行,没有按照优先级(无论有没有加括号);

风车呼呼呼 发表于 2022-5-25 21:25:04

你是怎么实验的?

jhq999 发表于 2022-5-25 22:50:41

这种东西不同编译器是不一样的,不建议这么写

tyf1218405122 发表于 2022-5-26 16:00:08

jhq999 发表于 2022-5-25 22:50
这种东西不同编译器是不一样的,不建议这么写

但是有笔试,所以要弄清楚这个.

jhq999 发表于 2022-5-26 16:25:34

本帖最后由 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]
查看完整版本: 有关与逻辑运算符问题