吾爱程序员:这里有好玩的游戏和软件
当前位置:首页C语言教程 → C中的运算符优先级和关联性

C中的运算符优先级和关联性

来源:网络 | 更新时间:2022-01-09 09:08:54
运算符优先级确定在具有多个具有不同优先级的运算符的表达式中首先执行哪个运算符。 例如:求解 
10 + 20 * 30
10 + 20 * 30计算为10 + (20 * 30)
而不是(10 + 20) * 30
当两个具有相同优先级的运算符出现在一个表达式中时,使用运算符关联性。关联可以是从左到右或从右到左例如: “*”和“/”具有相同的优先级,它们的关联性是从左到右,所以表达式的“100/10 * 10”被视为“(100/10)* 10”。 运算符优先级和关联性是运算符的两个特征,它们在没有括号的情况下确定子表达式的评估顺序 例如:求解 
100 + 200 / 10 - 3 * 10
1) 仅当有两个或多个具有相同优先级的运算符时才使用关联性。  需要注意的一点是关联性并没有定义评估单个运算符的操作数的顺序。例如,考虑以下程序,+ 运算符的关联性是从左到右的,但这并不意味着 f1() 总是在 f2() 之前调用。以下程序的输出实际上取决于编译器。
// Associativity is not used in the below program.
// Output is compiler dependent.

#include <stdio.h>

int x = 0;
int f1()
{
x = 5;
return x;
}
int f2() 
{
x = 10;
return x;
}
int main()
{
int p = f1() + f2();
printf("%d ", x);
return 0;
}
2)具有相同优先级的所有运算符具有相同的关联性  这是必要的,否则编译器将无法确定具有相同优先级和不同关联性的两个运算符的表达式的评估顺序。例如 + 和 – 具有相同的关联性。 3)后缀++和前缀++的优先级和结合性不同  后缀++的优先级比前缀++多,它们的结合性也不同。后缀++的结合性是从左到右,前缀++的结合性是从右到左。 4)逗号在所有运算符中的优先级最低,应谨慎使用例如考虑以下程序,输出为1。
#include <stdio.h>
int main()
{
int a;
a = 1, 2, 3; // Evaluated as (a = 1), 2, 3
printf("%d", a);
return 0;
}
5)C中没有比较运算符的链接  在Python中,像“c > b > a”这样的表达式被视为“c > b and b > a”,但是这种类型的链接在C中不会发生。例如考虑以下程序。以下程序的输出为“FALSE”。 
#include <stdio.h>
int main()
{
int a = 10, b = 20, c = 30;

// (c > b > a) is treated as ((c > b) > a), associativity of '>'
// is left to right. Therefore the value becomes ((30 > 20) > 10)
// which becomes (1 > 10)
if (c > b > a)
printf("TRUE");
else
printf("FALSE");
return 0;
}
请参阅以下优先级和关联性表以供参考。 
运算符 描述   关联性  
( )  [ ]  。  ->  ++ — 括号(函数调用)(见注 1) 方  括号(数组下标)  通过对象名称  选择成员 通过指针选择成员  后缀递增/递减(见注 2) 左到右
++ —  + –  !~  (类型 sizeof 前缀递增/递减  一元加/减  逻辑否定/按位补码  强制转换(将值转换为类型的临时值)  取消引用  地址(操作数)  确定此实现的字节大小 右到左
* / % 乘法/除法/模数 左到右
+ – 加法/减法 左到右
<< >> 按位左移,按位右移 左到右
< <=  > >= 关系小于/小于或等于  关系大于/大于或等于 左到右
== != 关系等于/不等于 左到右
& 按位与 左到右
^ 按位异或 左到右
| 按位包含 OR 左到右
&& 逻辑与 左到右
| | 逻辑或 左到右
? : 三元条件 右到左
+= -=  *= /=  %= &=  ^= |=  <<= >>= 赋值  加法/减法赋值  乘法/除法赋值  模数/按位 AND 赋值  按位异/包含 OR 赋值  按位左移/右移赋值 右到左
, 逗号(单独的表达式) 左到右
了解优先级和关联性规则是件好事,但最好的办法是使用括号,尤其是对于不太常用的运算符(除 +、-、*.. 等以外的运算符)。括号增加了代码的可读性,因为读者无需查看表格即可找出顺序。

最新文章

热点资讯

手游排行榜

CopyRight 2020-2030吾爱程序员

鄂ICP备2021004581号-8

本站资源收集于网络,如有侵权请联系我们:35492删除0109@qq.com