c语言运算符
前言 :
这篇笔记是大一下学期跟随老师学C语言时跟着老师写下的笔记
- 由一个或多个操作数(变量,常量,字面值)以及运算符组成的符合C语言规则的式子叫做表达式
- 表达式经过计算得到的结果称为表达式的值
- C语言中数据可以分为左值和右值:
- 左值:可以写的内存块(变量)
- 右值:可以读取的内存块(变量,常量,字面值)
- C语言中的运算符:
- 算术运算符:+,-,*,/,%,++,–
- 关系运算符:>,<,==,!=,>=,<=
- 逻辑运算:&&,||(或),,!(非)
- 赋值运算:
- =(赋值)
- +=,-=,*=,/=,%=(算术复合赋值运算符)
- &=,|=,^=,>>=(位运算复合赋值运算符)
- 位运算符:&,|,^,-,~,>>,<<
- 条件运算符:?:
- 逗号运算符:,
- 指针运算符:&(取地址符),*(寻址符)
- 求字节运算符:sizeof(获取字节数)
- 特殊运算符:()(括号运算符),[](数组下标运算符),->(结构指针访问成员运算符)
- 几个重要概念
- 优先级:运算符执行的优先级,优先级高的先执行
- 结合性:当优先级相同时,可以通过结合性确定表达式如何结合来确定执行的先后顺序
- 类别:参与当前运算符运算的操作数个数,一元吗,二元,三元
一,算术运算符
1.1+,-,*,/,%
-
都属于二元运算符
-
运算规则:四则运算法则
-
结果是一个值(右值,常量值)
-
需要注意的地方:
- 运算结果由参与运算的两个操作数类型决定
- /除法运算符的右操作符不能为0
- %运算符
- 取余运算符的操作数必须为整型
- 结果的符号由左操作数决定
- C语言与Python对于负数取余结果是不一致的,原因是C语言与Python在处理整除运算时取值方向不一致,C语言向0取整,Python向负无穷取整
1.2 ++,–
- ++称之为自增运算,–称之为自减运算
- 拿++举例:
- 前自增(前++):++操作数
- 先在操作数自身基础上自加1,再取结果参与运算
- 后自增(后++):操作数++
- 先参与运算,再在结果上自加1
- 前自增(前++):++操作数
二,赋值运算符
2.1 简单赋值运算符
- =(简单赋值运算符) 二元运算符
- 优先级很低(仅高于逗号运算符)
- 结合性从右到左
2.2 复合赋值运算符
- op=(op表示算数运算符及位运算符) (+=,-=,%=…)
三,关系运算符
- >,<,==,!=,>=,<=
- 二元运算符
- 结合性:从左到右
- 优先级:>,<,>=,<=的优先级高于 ==,!=,关系运算符的优先级小于算数运算符
- 关系运算符的结果为1或0(1代表true,0代表false)
- 判断num变量的值是否在1~100之间;(1<=num&&num<=100)
四,逻辑运算符
-
&&(逻辑与,二元运算符),||(逻辑或二元运算符),!(逻辑非运算符)
-
从结果上来说,C语言中真就是1,假就是0
#include <stdio.h>
int main(void) {
int num;
scanf("%d",&num);
printf("%d\n",num>=1 && num<=99);
}
-
从参与逻辑运算的操作数上来讲,C语言中非0代表真,0代表假
-
&&逻辑与
- 真&&真->真
- 真&&假->假
- 假&&真->假
- 假&&假->假
-
||逻辑或
- 真||真->真
- 真||假->真
- 假||真->真
- 假||假->假
-
!逻辑非
- !真->假
- !假->真
-
逻辑或的短路问题:当左操作数为真时,即可判断表达式结果,右操作数不执行
#include <stdio.h> int main(void) { int a=1,b=1; printf("%d\n",++a||++b); printf("a=%d b=%d\n",a,b); //a=2 b=1 return 0; }
-
逻辑与的短路问题: 当做操作数为假时,即可判断表达式的结果为假,右操作数不执行
#include <stdio.h> int main(void) { int a=-1,b=-1; printf("%d\n",++a&&++b); printf("a=%d b=%d\n",a,b); //a=0 b=-1 return 0; }
五,条件运算符(三元运算符,三目运算符)
-
操作数1?操作数2:操作数3
-
表示含义:判断操作数1结果是否为真,如果操作数1结果为真,则整个条件表达式的结果为操作数2,否则整个条件表达式的结果为操作数3
-
条件运算符是唯一一个三元运算符,所以有些地方也称之为三元运算符
#include <stdio.h> int main(void) { int num; scanf("%d",&num); printf("%s\n",num%2==1? "奇数":"偶数"); printf("%s\n",num%2? "奇数":"偶数"); return 0; }
六,位运算符
-
&(位与),|(位或),~(位非),^(位异或),<<(位左移),>>(位右移)
-
位运算就是直接操作二进制位
-
运算符
-
&:两个操作数按位进行与运算(例如利用IP地址和子网掩码求网关)
#include <stdio.h> int main(void) { short a = 18, b = 9; short c = a & b; // a : 0000 0000 0001 0010 // b : 0000 0000 0000 1001 // a&b: 0000 0000 0000 0000 printf("%d\n",c); // c=0 return 0; }
-
|:两个操作数按位进行或运算
-
~:将操作数按位进行非运算
#include <stdio.h> int main(void) { short a = 18; // 0000 0000 0001 0010 short b = ~a; // 1111 1111 1110 1101 printf("%d\n",b); return 0; }
-
^:两个操作数按位进行异或运算
-
异或规则:相同为0,不同为1
-
0^0->0 1^1->0 0^1->1 1^0->1
short a = 18; // 0000 0000 0001 0010 short b = 15; // 0000 0000 0000 1111 short c = a^b; // 0000 0000 0001 1101 (29)
-
异或特性:一个数a位异或另外一个数b两次,结果还是这个数a本身
-
-