前言
在嵌入式系统设计中C语言至关重要,最近在复习C语言运算符与表达式优先级,发现我好像没有学过C语言,所以这次记录一下C语言运算符的优先级。
一、运算符的分类
根据操作数的个数分为:单目运算符,双目运算符,三目运算符
例如: A&&B、 A&B、 A||B、A!=B等形式的运算符,被称为双目运算符
例如:A++,~A,!A,被称为单目运算符
例如:A>B?A=1:A=0 条件运算符?:是唯一的三目运算符
根据运算符的功能分类:
算术运算符、关系运算符、逻辑运算符、赋值运算符、条件运算符、位运算符、逗号运算符以及其他运算符
1.算术运算符
自增(++),自减(–)
++value :前缀方式:先将变量的值+1,然后取变量新值参与表达式运算
value++ :后缀方式:先取变量值参与表达式运算,然后再将变量的值+1
#include <stdio.h>
int main(void)
{
int a1 = 0;
int a2 = 0;
int b = 0;
a1 = b++; /* 先取变量值参与表达式运算 a1 == 0 b == 1 */
printf("a1 = %d,b = %d\r\n",a2,b);
a2 = ++b; /* 取变量新值参与表达式运算 a2 == 2 b == 2 */
printf("a2 = %d,b = %d\r\n",a2,b);
}
2.关系运算符
等于(==)、非等于(!=)、小于(<)、大于(>)、小于等于(<=)、大于等于(>=)六种符号,关系成立为1,关系不成立为0。适用于数值运算,在进行字符串比较是不能直接比较字符,使用地址进行比较
#include <stdio.h>
int main(void)
{
char *str1 = "Hello,Word";
char *str2 = "Hello,Wrd";
if( str1 == str2 )
{
printf("两个字符串一样!");
}
else
{
printf("两个字符串不一样!");
}
return 0;
}
3.逻辑运算符
逻辑与(&&)逻辑或(||),逻辑非(!)成立为true,不成立false
1 && 2 == 1、0 && 1 == 0、1 || 0 == 1、!2 == 0
4.赋值运算符
赋值运算符(=)将某一表达式的值 赋值 给变量
a += 12;//a = a + 12
a * = 12;//a = a * 12
m += n = p = 30; // m = m +( n = p = 50)--> m = m +50
5.条件运算符
条件运算符是C语言中唯一的三目运算符
操作数1 ? 操作数2 : 操作数3
例1 a > b ?( a = 1 ) : ( a = 0 )
#include <stdio.h>
#define cmp(a,b) (a>b)?(a=1):(a=2)/* 注意运算符优先级 */
int main(void)
{
int a = 0;
int b = 0;
printf("请输入第一个数值:");scanf("%d",&a);
printf("请输入第二个数值:");scanf("%d",&b);
(a>b)?(a=1):(a=2);
if( a == 1 )
printf("第一个值大于第二个" );
else if( a == 2 )
printf("第一个值小于第二个" );
else
printf("false!");
return 0;
}
较为复杂的条件运算:d = a > b ? ( a > c ? a : c) : ( b > c ? b : c )
d = a > b ? ( a > c ? a : c) : ( b > c ? b : c )
//换一种形式
d = a > b : A : B
A = a > c ? a : c
B = b > c ? b : c
//等价于
if (a > b)
{
d = A;
if(a > c)
A = a; /* d = a */
else
A = c; /* d = c */
}
else
{
d = B;
if( b > c )
B = b; /* d = b */
else
B = c; /* d = c */
}
6.逗号运算符
多个表达式用逗号运算符组合成一个表达式:
表达式1,表达式2,表达式3……
7.位运算符
要求操作数是整型数,并按二进制位的顺序处理
取反(~)、按位与(&)、按位或( | )、按位异或( ^ )、按位左移( << )、按位右移(>>)、
8.运算符优先级
在C语言中,对各种运算符的优先级是有规定的,必须遵守。
单目运算符的优先级 > 双目运算符 > 三目运算符:例程请看三目运算符
总结:1)在双目运算符中:逻辑运算符(&&、||) < 关系运算符(<、 == )
2) 关系运算符(<、==) < 移位运算符(<<、>>) < 算术运算符(++、–)
#include <stdio.h>
int main(void)
{
int a = 3;
int b = 4;
int c = 2;
int d = 0;
if(a < b && a > c)
printf("逻辑运算符优先级 < 关系运算符优先级\r\n");
else
printf("逻辑运算符优先级 > 关系运算符优先级\r\n");
if(a > b >> ++d) /* if(a > (b >> (++d))) */
{
/* d == 1, (b >> 1) == 2, a == 3, a> (b>>1) */
printf("d = %d , b = %d , a = %d \r\n",d,b>>1,a);
printf("算术运算符 > 移位运算符 > 关系运算符");
}
}
总结
在实际编程中,在不清楚优先级的情况下,本人通常使用 括号 来提升运算符的优先级,保证运算的逻辑不会出错,之所以会总结运算符以及运算符的优先级关系,是因为在一些考试中会使用到,另一个原因是弥补自己的知识点