vvqboy 发表于 2014-6-14 13:08:28

求助&&和||的运算符优先级

本帖最后由 风之残月 于 2014-11-10 10:26 编辑

int main()
{
      int a, b, c; a = b = c = 1; ++a || --b && ++c;
      printf ("%d, %d, %d", a, b, c);
      system("pause");
      return 0;
}

这道题的运行结果是 2 1 1
我的理解,++a后,|| 后面的运算短路,没有执行,所以--b 和 ++c都没有运算。

可问题是,&& 不是 比 ||的运算符优先级要高么?那这道题运算顺序应该是


++a ||( --b && ++c);
也就是说,--b先算,短路后,a和c不参与运算
那结果应该是1 0 1


我是师兄 发表于 2014-6-14 13:08:29

你把优先级的含义完全弄错了

优先级完全没有确定哪些表达式先计算的功能

优先级仅有的用处在于 确定运算符和哪些子表达式结合
这里 &&优先级高 所以 && 先和 左右2个子表达式结合成为一个整体
&&的全部意义到此为止
没有什么--b先算的意思的

HHR 发表于 2014-6-14 13:53:26

#include "stdio.h"
int main( void )
{
        int a, b, c;

        a = b = c = 1;

        ++a || --b && ++c;
        printf("%d %d %d\n", a, b, c );

        1 && ++a || --b && ++c;
        printf("%d %d %d\n", a, b, c );
       
        ++a && ++a || --b && ++c;
        printf("%d %d %d\n", a, b, c );//运算符 || 前面的值要完全算出来
       
        0 && ++a || --b && ++c;
        printf("%d %d %d\n", a, b, c );//如果是零就算后面的部分,这里就是优先级的体现,(++a) 没有跟 (--b) 作或运算
                                                                       // 因为 (++a) 为非零,但输出 b 值为零,c值不变,可见是 || 后面的是一个整体运算
       
        0 && ++a || ++b && ++c;
        printf("%d %d %d\n", a, b, c );//&& 运算符也是同样的处理,前面是非零就继续算后面的值
        return 0;   // 所以 && 和 || 的运算级还是正确的在这个程序里体现出来。。。
}

vvqboy 发表于 2014-6-14 14:26:20

本帖最后由 vvqboy 于 2014-6-16 11:46 编辑

HHR 发表于 2014-6-14 13:53 static/image/common/back.gif
你给的代码,我后面的都懂,第一个式子是我提出的问题,可没有任何解释
++a || --b && ++c;
&&的优先级高
那这道题运算顺序应该是
++a ||( --b && ++c);
也就是说,--b先算,短路后,a和c不参与运算
那结果应该是1 0 1

ravenhu13 发表于 2014-6-14 15:39:51

HHR 发表于 2014-6-14 13:53 static/image/common/back.gif


楼上正解。

zfw4161 发表于 2014-6-14 16:25:12

         &&高于||

戏++ 发表于 2014-6-14 18:19:24

实际开发中不会碰到类似的问题,感觉还是别钻牛角尖了,花点时间在别的领域上面

牡丹花下死做鬼 发表于 2014-6-15 08:16:32

给你个忠告把自增自减写成一个独立的语句否则你会后悔的
至于这个问题二楼回答的很详细了我就不多说了

仰望天上的光 发表于 2014-6-15 11:21:36

优先级只是决定了一个表达式的结合性,优先级高的不一定先算,比如:
a+b*c中,由于*优先级比=高,所以源表达式结合性为(a)+(b*c),但该表达式既可以先对运算符+的第一个操作数a求值也可以先对运算符+的第二个操作数b*c求值

oggplay 发表于 2014-6-15 20:17:47

本帖最后由 oggplay 于 2014-6-16 15:02 编辑

看警告:lol:



规则:&&、| |都是先计算左边表达式的值,当左边表达式的值能确定整个表达式的值时,就不再计算右边表达式的值。

根据优先级(或者编译器警告)表达式等价于:(++a)||(--b&&++c)
如果你改成int a, b, c; a =c = -1;b=1; ++a || --b && ++c; 结果变了,并且验证了上述规则的正确性。
*这里有一个技巧:p&&*p++不会导致间接引用一个空指针。

vvqboy 发表于 2014-6-16 11:23:09

戏++ 发表于 2014-6-14 18:19 static/image/common/back.gif
实际开发中不会碰到类似的问题,感觉还是别钻牛角尖了,花点时间在别的领域上面

问题是我现在是老师,这道题要给学生讲解的

vvqboy 发表于 2014-6-16 11:33:00

zfw4161 发表于 2014-6-14 16:25 static/image/common/back.gif
&&高于||

&& 运算符优先级高,那表达式应该等于++a || (--b && ++c)
也就是最终的运算结果,应该是1 0 1
可实际运算结果是2 11
也就是++a先算了

vvqboy 发表于 2014-6-16 11:34:15

牡丹花下死做鬼 发表于 2014-6-15 08:16 static/image/common/back.gif
给你个忠告把自增自减写成一个独立的语句否则你会后悔的
至于这个问题二楼回答的很详细了我就不多说了

我纠结这个问题是因为我现在是老师,这是一道考试题要给学生讲。
&& 运算符优先级高,那表达式应该等于++a || (--b && ++c)
也就是最终的运算结果,应该是1 0 1
可实际运算结果是2 11
也就是++a先算了

vvqboy 发表于 2014-6-16 11:36:22

oggplay 发表于 2014-6-15 20:17 static/image/common/back.gif
看警告




亲,我这道题是怎么回事,结果是2 1 1
按你说的,&&优先级高,结果应该是 1 0 1呀

oggplay 发表于 2014-6-16 15:03:47

vvqboy 发表于 2014-6-16 11:36 static/image/common/back.gif
亲,我这道题是怎么回事,结果是2 1 1
按你说的,&&优先级高,结果应该是 1 0 1呀

改了一下 表达式等价于:(++a)||(--b&&++c),++a忘了加括号

sonusyws 发表于 2014-6-16 16:38:55

印象中记得自增自减也有优先级   你可以去查查他们和&&||的优先级

可能帮不上忙

zhudesheng 发表于 2018-7-29 21:59:44

如果按你怎么说++ -- 优先级是不是比&&高,是不是后面的要先进行计算?
页: [1]
查看完整版本: 求助&&和||的运算符优先级