C语言运算符优先级表

  1. 第一优先级:括号运算符(())和数组下标运算符([])以及成员访问运算符(.和->)
    • 括号运算符用于改变运算顺序。例如(a + b)*c,先计算括号内的a + b
    • 数组下标运算符用于访问数组元素,如a[3]
    • 成员访问运算符用于访问结构体或联合体中的成员,如struct student s; s.age(通过对象访问)或者struct student *p; p->age(通过指针访问)。
  2. 第二优先级:一元运算符(如++、–、!、~、-、+、*、&)
    • 自增(++)和自减(--)运算符有前置和后置之分。前置是先改变变量的值再使用,后置是先使用变量的值再改变。例如int a = 1; int b=++a;b的值为2,a的值为2),int c = 1; int d = c++;d的值为1,c的值为2)。
    • !是逻辑非运算符,将真变为假,假变为真。例如int a = 0; int b=!a;b的值为1)。
    • ~是按位取反运算符,对一个整数的二进制位进行取反操作。
    • -+在这里作为一元运算符时,分别表示取负和取正。例如int a=-3;(取负),int b = +4;(取正,通常可以省略+)。
    • *作为一元运算符是指针运算符,用于访问指针所指向的内容。例如int a = 10; int *p=&a; int b=*p;b的值为10)。
    • &是取地址运算符,用于获取变量的地址。例如int a; int *p = &a;获取a的地址并赋值给p
  3. 第三优先级:算术运算符(乘除模:*、/、%)
    • 乘法、除法和取模运算优先级相同。例如int a = 6/2*3;(先计算6/2得到3,再乘以3,结果为9),int b = 7%3;(结果为1)。
  4. 第四优先级:算术运算符(加减:+、-)
    • 加法和减法优先级相同。例如int a = 3 + 4-2;(先计算3 + 4得到7,再减去2,结果为5)。
  5. 第五优先级:移位运算符(左移:«,右移:»)
    • 左移运算符<<是将一个数的二进制位向左移动指定的位数,右边补0。例如int a = 1<<3;(1的二进制是00000001,左移3位后得到00001000,即8)。
    • 右移运算符>>是将一个数的二进制位向右移动指定的位数。如果是无符号数,左边补0;如果是有符号数,左边补符号位。例如unsigned int b = 8>>2;(8的二进制是00001000,右移2位后得到00000010,即2)。
  6. 第六优先级:关系运算符(<、<=、>、>=)
    • 用于比较两个值的大小关系。例如int a = 3; int b = 5; int c=a < b;c的值为1,因为3小于5)。
  7. 第七优先级:关系运算符(==、!=)
    • 用于判断两个值是否相等或不相等。例如int a = 3; int b = 3; int c=a == b;c的值为1)。
  8. 第八优先级:逻辑与运算符(&&)
    • 只有当两个操作数都为真时,结果才为真。例如int a = 1; int b = 0; int c=a && b;c的值为0)。
  9. 第九优先级:逻辑或运算符(||)
    • 只要两个操作数中有一个为真,结果就为真。例如int a = 1; int b = 0; int c=a || b;c的值为1)。
  10. 第十优先级:条件运算符(?:)
    • 这是一个三目运算符,语法为表达式1?表达式2:表达式3。如果表达式1为真,则返回表达式2的值,否则返回表达式3的值。例如int a = 3; int b = 5; int c=(a > b)?a:b;c的值为5)。
  11. 第十一优先级:赋值运算符(=、+=、-=、*=、/=、%=、«=、»=、&=、^=、|=)
    • 基本的赋值运算符=用于将一个值赋给一个变量。例如int a; a = 3;
    • 复合赋值运算符是先进行算术或位运算,然后再赋值。例如int a = 3; a += 2;(相当于a = a+2,结果为5)。
  12. 第十二优先级:逗号运算符(,)
    • 逗号运算符用于将多个表达式连接起来,从左到右依次计算表达式的值,整个逗号表达式的值等于最后一个表达式的值。例如int a = (3, 4, 5);a的值为5)。

下表将按运算符优先级从高到低列出各个运算符,具有较高优先级的运算符出现在表格的上面,具有较低优先级的运算符出现在表格的下面。在表达式中,较高优先级的运算符会优先被计算。

类别运算符结合性
后缀() [] -> . ++ --从左到右
一元+ - ! ~ ++ -- (type)* & sizeof从右到左
乘除* / %从左到右
加减+ -从左到右
移位<< >>从左到右
关系< <= > >=从左到右
相等== !=从左到右
位与 AND&从左到右
位异或 XOR^从左到右
位或 OR|从左到右
逻辑与 AND&&从左到右
逻辑或 OR||从左到右
条件?:从右到左
赋值= += -= *= /= %= >>= <<= &= ^= |=从右到左
逗号,从左到右
Licensed under CC BY-NC-SA 4.0