运算符优先级

优先级可能会有问题吧,如果我没记错的话,应该是没问题的!!吧?算了算了,稳妥起见还是加括号吧,好无奈。每次都这样,记了忘,忘了又记,如此反复…好记性不如烂笔头,还是总结下备忘。

1 常见运算符


1、四则运算运算符

  • +
  • -
  • *
  • /
  • %

2、移位运算符

  • >> (右移)
  • << (左移)

3、关系运算符

  • >
  • <
  • >=
  • <=
  • ==
  • !=

4、逻辑位运算符

  • & (按位与)
  • | (按位或)
  • ^ (按位异或)
  • ~ (按位非)

5、逻辑运算符

  • &&
  • ||
  • !

6、赋值运算符

  • =
  • +=
  • -=
  • +=
  • /=
  • %=
  • &=
  • |=
  • ^=
  • >>=
  • <<=

7、自增自减运算符

  • a++
  • ++a
  • a--
  • --a

8、动态内存分配运算符

  • new
  • new []
  • delete
  • delete []

9、类型转换运算符

  • type() (函数风格转型)
  • (type) (C 风格转型)

10、成员访问运算符

  • .(前面有个
  • ->

11、取值、取地址、取大小运算符

  • *
  • &
  • sizeof

12、其它

  • :: (作用域运算符)
  • a() (函数调用)
  • [] (下标)
  • ? : (三元条件)

2 代码(部分,遇到好的示例会更新)


#include 
using namespace std;

int main()
{
	cout << "-----四则运算运算符 vs 移位运算符-----" << endl;
	cout << "1 << 2 + 3: " << (1 << 2 + 3) << endl;
	cout << "1 << 2 * 2: " << (1 << 2 * 2) << endl;
	cout << "四则运算运算符 +、-、*、/、%优先级大于移位运算符 <<、>>" << endl << endl;

	cout << "-----移位运算符 vs 比较运算符-----" << endl;
	cout << "3 > 1 << 2: " << (3 > 1 << 2) << endl;
	cout << "3 > 1 << 2: " << (1 == 1 << 2) << endl;
	cout << "移位运算符 <<、>> 优先级大于比较运算符 >、<、>=、<=、==、!=" << endl << endl;

	cout << "-----逻辑位运算符 vs 比较运算符-----" << endl;
	cout << "5 | 2 > 1: " << (5 | 2 > 1) << endl;
	cout << "逻辑位运算符 &、|、^ 优先级小于比较运算符 >、<、>=、<=、==、!=" << endl;
	cout << "~(7 > 8): " << (~(7 > 8)) << endl;
	cout << "~7 > 8: " << (~7 > 8) << endl;
	cout << "逻辑位运算符还包括 ~ ,其为单目运算符,优先级高于比较运算符" << endl << endl;

	cout << "-----逻辑位运算符 vs 逻辑运算符-----" << endl;
	cout << "1 && 1 | 7: " << (1 && 1 | 7) << endl;
	cout << "逻辑位运算符 &、|、^ 优先级大于逻辑运算符 &&、||" << endl;
	cout << "1 && 1 | 7: " << (!0 | 7) << endl;
	cout << "逻辑位运算符还包括 ! ,其为单目运算符,优先级高于逻辑位运算符" << endl << endl;

	cout << "-----比较运算符之间优先级-----" << endl;
	cout << "3 > 1 == 8 < 4: " << (3 > 1 == 8 < 4) << endl;
	cout << "3 > 1 != 8 < 0: " << (3 > 1 != 8 < 0) << endl;
	cout << " ==、!= 优先级低于 >、<、>=、<=、" << endl << endl;
	system("pause");
    return 0;
}

//输出
-----四则运算运算符 vs 移位运算符-----
1 << 2 + 3: 32
1 << 2 * 2: 16
四则运算运算符 +、-、*、/、%优先级大于移位运算符 <<、>>

-----移位运算符 vs 比较运算符-----
3 > 1 << 2: 0
3 > 1 << 2: 0
移位运算符 <<、>> 优先级大于比较运算符 >、<、>=、<=、==、!=

-----逻辑位运算符 vs 比较运算符-----
5 | 2 > 1: 5
逻辑位运算符 &、|、^ 优先级小于比较运算符 >、<、>=、<=、==、!=
~(7 > 8): -1
~7 > 8: 0
逻辑位运算符还包括 ~ ,其为单目运算符,优先级高于比较运算符

-----逻辑位运算符 vs 逻辑运算符-----
1 && 1 | 7: 1
逻辑位运算符 &、|、^ 优先级大于逻辑运算符 &&、||
1 && 1 | 7: 7
逻辑位运算符还包括 ! ,其为单目运算符,优先级高于逻辑位运算符

-----比较运算符之间优先级-----
3 > 1 == 8 < 4: 0
3 > 1 != 8 < 0: 1
 ==、!= 优先级低于 >、<、>=、<=、

3 结论


0、优先级

  • 单目运算符 > 双目运算符 > 三目运算符;

1、单目运算符优先级

  • 结合性规定对于一元运算符是冗余的,只为完备而给出:一元前缀运算符 始终 从右到左 结合,delete ++*p 被解释为 delete(++(*p)) ;而 一元后缀运算符 始终 从左到右 结合,a[1][2]++ 被解释为 ((a[1])[2])++

2、双目运算符优先级

  • 四则运算运算符 > 移位运算符 > 关系运算符 > 逻辑位运算符 > 逻辑运算符 > 赋值运算符;
  • 四则运算符中,+、- 优先级低于 *、/、%;
  • 比较运算符中,==、!= 优先级低于 >、<、>=、<=;

3、三目运算符优先级

  • C 中,三元条件运算符拥有高于赋值运算符的优先级。因此,表达式 e = a < d ? a++ : a = d 在 C++ 中剖析成 e = ((a < d) ? (a++) : (a = d)),但在 C 中会由于 C 的语法或语义制约而编译失败;

4、其它

  • 拥有相同优先级的运算符以其结合性的方向与各参数绑定。例如表达式 a = b = c 被分析为 a = (b = c) 而非 (a = b) = c,因为赋值具有从右到左结合性,但 a + b - c 被分析为 (a + b) - c 而非 a + (b - c),因为加法和减法具有从左到右结合性。

4 参考文献


https://zh.cppreference.com/w/cpp/language/operator_precedence

你可能感兴趣的:(C/C++)