C语言运算符以及运算优先级


前言

在嵌入式系统设计中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 == 10 && 1 == 01 || 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("算术运算符 > 移位运算符 > 关系运算符"); 
	}
}

总结

在实际编程中,在不清楚优先级的情况下,本人通常使用 括号 来提升运算符的优先级,保证运算的逻辑不会出错,之所以会总结运算符以及运算符的优先级关系,是因为在一些考试中会使用到,另一个原因是弥补自己的知识点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值