鱼C论坛

 找回密码
 立即注册
查看: 3049|回复: 16

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

[复制链接]
发表于 2014-6-14 13:08:28 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 风之残月 于 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


最佳答案

查看完整内容

你把优先级的含义完全弄错了 优先级完全没有确定哪些表达式先计算的功能 优先级仅有的用处在于 确定运算符和哪些子表达式结合 这里 &&优先级高 所以 && 先和 左右2个子表达式结合成为一个整体 &&的全部意义到此为止 没有什么--b先算的意思的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-14 13:08:29 | 显示全部楼层
你把优先级的含义完全弄错了

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

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

评分

参与人数 1鱼币 +5 贡献 +3 收起 理由
vvqboy + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-14 13:53:26 | 显示全部楼层
  1. #include "stdio.h"
  2. int main( void )
  3. {
  4.         int a, b, c;

  5.         a = b = c = 1;

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

  8.         1 && ++a || --b && ++c;
  9.         printf("%d %d %d\n", a, b, c );
  10.        
  11.         ++a && ++a || --b && ++c;
  12.         printf("%d %d %d\n", a, b, c );  //  运算符 || 前面的值要完全算出来
  13.        
  14.         0 && ++a || --b && ++c;
  15.         printf("%d %d %d\n", a, b, c );  //  如果是零就算后面的部分,这里就是优先级的体现,(++a) 没有跟 (--b) 作或运算
  16.                                                                          // 因为 (++a) 为非零,但输出 b 值为零,c值不变,可见是 || 后面的是一个整体运算
  17.        
  18.         0 && ++a || ++b && ++c;
  19.         printf("%d %d %d\n", a, b, c );  //  && 运算符也是同样的处理,前面是非零就继续算后面的值
  20.         return 0;   // 所以 && 和 || 的运算级还是正确的在这个程序里体现出来。。。
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-14 14:26:20 | 显示全部楼层
本帖最后由 vvqboy 于 2014-6-16 11:46 编辑
你给的代码,我后面的都懂,第一个式子是我提出的问题,可没有任何解释
++a || --b && ++c;
&&的优先级高
那这道题运算顺序应该是
++a ||( --b && ++c);
也就是说,--b先算,短路后,a和c不参与运算
那结果应该是1 0 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-14 15:39:51 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-14 16:25:12 | 显示全部楼层
         &&高于||
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-14 18:19:24 | 显示全部楼层
实际开发中不会碰到类似的问题,感觉还是别钻牛角尖了,花点时间在别的领域上面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-15 08:16:32 | 显示全部楼层
给你个忠告  把自增自减写成一个独立的语句  否则你会后悔的
至于这个问题二楼回答的很详细了我就不多说了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-15 11:21:36 | 显示全部楼层
优先级只是决定了一个表达式的结合性,优先级高的不一定先算,比如:
a+b*c中,由于*优先级比=高,所以源表达式结合性为(a)+(b*c),但该表达式既可以先对运算符+的第一个操作数a求值也可以先对运算符+的第二个操作数b*c求值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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++不会导致间接引用一个空指针。
9.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-16 11:23:09 | 显示全部楼层
戏++ 发表于 2014-6-14 18:19
实际开发中不会碰到类似的问题,感觉还是别钻牛角尖了,花点时间在别的领域上面

问题是我现在是老师,这道题要给学生讲解的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-16 11:33:00 | 显示全部楼层

&& 运算符优先级高,那表达式应该等于++a || (--b && ++c)
也就是最终的运算结果,应该是1 0 1
可实际运算结果是2 11
也就是++a先算了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-16 11:34:15 | 显示全部楼层
牡丹花下死做鬼 发表于 2014-6-15 08:16
给你个忠告  把自增自减写成一个独立的语句  否则你会后悔的
至于这个问题二楼回答的很详细了我就不多说了

我纠结这个问题是因为我现在是老师,这是一道考试题要给学生讲。
&& 运算符优先级高,那表达式应该等于++a || (--b && ++c)
也就是最终的运算结果,应该是1 0 1
可实际运算结果是2 11
也就是++a先算了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-16 11:36:22 | 显示全部楼层

亲,我这道题是怎么回事,结果是2 1 1
按你说的,&&优先级高,结果应该是 1 0 1呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-16 15:03:47 | 显示全部楼层
vvqboy 发表于 2014-6-16 11:36
亲,我这道题是怎么回事,结果是2 1 1
按你说的,&&优先级高,结果应该是 1 0 1呀

改了一下 表达式等价于:(++a)||(--b&&++c),++a忘了加括号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-16 16:38:55 | 显示全部楼层
印象中记得  自增  自减  也有优先级   你可以去查查他们和  &&  ||  的优先级

可能帮不上忙  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-29 21:59:44 | 显示全部楼层
如果按你怎么说++ -- 优先级是不是比&&高,是不是后面的要先进行计算?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表