算符优先级的问题

来源:互联网 发布:淘宝模特小茹 编辑:程序博客网 时间:2024/06/05 07:28

算符优先级首先决定了,一些括号是可加可不加,还是必须加;

  • 逻辑判断(==, !=, >, <)最终的返回都是布尔类型;

1. 注意

  • b & 1 == 0 ⇒ b & (1 == 0) ⇒ 0
    • 显然不是期望的结果
    • ==(!=,比较运算符) 的优先级要大于 & (|/^,位运算符)
  • 移位运算符(>>/<< )大于比较运算符(> / < / ==)

    cout << boolalpha << a == b << endl;                // 是会报错的;cout << boolalpha << (a == b) << endl;
  • 相等性比较运算!= / ==的优先级要高于赋值运算(=)。

DIR *dp;struct dirent *dirp;if (dp = opendir(argv[1]) == NULL){}            // 编译不通过            // opendir(argv[1]) == NULL,先结合            // 也即 dp = (opendir(argv[1]) == NULL)            // 将一个布尔变量,赋值给一个指针显然编译不通过。

操作符的优先级确定了结合律;

  • !=(不等号) 的优先级要大于 = (赋值运算符)

    char key = '';while (key = getchar() != 'q'){                           // key 只有两种取值为 0 或者为 1    switch(key)    {        case 'f':            ...        case 't':            ...    }}

    所以,必要的时候,使用括号确定优先级:

    while ((key=getchar()) != 'q'){    ... }
  • +/-/*/\(加减乘除)的优先级要大于移位运算符(<<、>>)
0 0