C语言操作符的分类:
算术操作符 逻辑运算符 位操作符 赋值操作符
单目操作符 关系操作符 条件操作符(三目运算符)
逗号表达式 数组下标引用 函数调用 结构体成员使用
大体上,C语言的操作符具体就这么些,俗话说的好,饭得一口一口吃,知识也得一点一点学习;
首先让我们来了解一下这些操作符的使用规则和注意事项(坑踩的多了自然就平了,错误出的多了自然就开始怀疑人生了(.//囍\))
1.算术操作符
算术和算数有什么区别呢?
本质区别在于:算术是数学的一个分支,是数学的最初形式,而算数是动词,没有直接关系;如果把算术混淆为算数的话,可是给我们理工科的
闹了个大笑话了..
进入正题,算术操作符有哪些: + - * / % ++ --
加法运算符(+):是用来进行加法运算的,使其两侧的值相加;
减法运算符(-):是用来进行减法运算的,使其两侧的值相减;
乘法运算符(*):是用来进行乘法运算的,使其两侧的值相乘;
除法运算符(/):是用来进行除法运算的,左侧的值是被除数,右侧的值是除数.
求模运算符(%):只能用于整数运算不能用于浮点型,求模运算符给出其左侧整数除以右侧整数的余数;
递增运算符(++):对运算对象进行+1操作;
递减运算符( -- ):对运算对象进行-1操作;
//算术运算符
void Test_1() {
int a = 20;
int b = 10;
//加法运算
printf("a + b = %d
",a + b);
//减法运算
printf("a - b = %d
",a - b);
//乘法运算
printf("a * b = %d
",a * b);
//除法运算
printf("a / b = %d
",a / b);
//求模运算
printf("a %% b = %d
",a % b);
}
算术运算符使用注意事项和说明 :
让我们先了解一下除法的运算规则: 被除数 / 除数 = 商 ......余数 *** 除数不能为0,否则无意义.
1-两个实数的除法运算结果为一个双精度浮点数,两个整数的除法运算结果为一个整形数;如果输入
( 5 / 3 ) 结果 1;舍去小数部分.
2-%求模运算符的操作数只能为整数,其他的操作数可以是任何的算术类型;
(打印求模运算符%时,需要双%%来表示).
3-关于++和--我会在后面的单目操作符进行解释说明;
2.逻辑运算符
在C语言中,逻辑判断区分真假只有0和非0;
非零的数字能够转换成真,也就是数字1;假就是0;
1>分类: && || !
逻辑与 ( && ) :
例如 a && b ; 如果 a 和 b 都为真,那么结果为真 ,否则为假;
逻辑或( || ) :
例如 a || b ; 如果a 和 b 都为假,那么结果就为假,否则为真;
逻辑非( ! ) :
例如 !a ; 如果a为真,那么结果为假,反之,如果a为假,结果为真;
如果你不熟悉运算符或者觉得很别扭,请记住 : (练习 && 时间) == 完美;
2>运算符说明:
逻辑与( && )和逻辑或( || )都是双目运算符,要求使用它有两个运算对象;
逻辑非( ! ) 是单目运算符,要求使用它有一个运算对象;
求值顺序 :逻辑表达式的求值顺序是从左往右,一旦发现有使整个表达式为假的因素,就会立即停止求值;
3.位操作符
分类: & | ^ ~ >> <<
按位与 ( & ) : 通常用于二进制的取位操作,
例如一个数 and 1的结果就是取二进制的最末位,这样可以进行判断一个整数的奇偶,
二进制的最末位为0,表示该数位偶数,最末位为1则为奇数;
按位或 ( | ) : 通常用于二进制特定位上的无条件赋值,
例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数按位或( | ) 1之后再减一就可以了,
其实际意义就是把这个数强行变成最接近的偶数。
按位异或 ( ^ ) : 按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0.
按位取反( ~ ) : 就是把所有的二进制位,只要是1就变成0,0变成1;
左移运算符( << ) : a << b,表示对a的二进制数左移b位;
移位规则: 左边抛弃,右边补0;
右移运算符( >> ) :
右移运算分为两种: 1>逻辑移位 : 左边用0填充,右边抛弃;
2>算术移位 : 左边用原该值的符号位填充,右边抛弃;
4.赋值运算符
分类 : = += *= /= %= >>= <<= &= |= ^=
赋值运算符是把右侧表达式的值赋给左侧的变量.它们都用于更新变量,其用法都是
左侧一个变量名,右侧一个表达式.赋给变量的值是由右侧表达式的值调整后的值.
1 #include<stdio.h> 2 int main() { 3 // 以 += 为例,说明复合复制运算符的表达含义 4 // 同义理解 -=, *=,/=,%= 等赋值运算符 5 int x = 10; 6 int y = 20; 7 x += y; // x = x + y 8 return 0; 9 }
注意 和 说明 :
1-注意'='和"=="的区别,很多人都在这里过问题.(重要的事情说很多遍);
2-赋值运算符的优先级比算术运算符的优先级低;
2-复制运算符是把右侧表达式的值赋给左侧的变量.它们都用于更新变量,其用法都是
左侧一个变量名,右侧一个表达式,赋给变量的值是由右侧表达式的值调整之后的值决定.
4.虽然这些运算符可以由几行简单的代码表示,并且运行效果一样,但是使用赋值运算符
可以让代码看起来更紧凑,而且与一般代码相比,赋值运算符可以使生成的机器代码更高效
5.在使用for循环加入一些复杂的表达式时,赋值运算符就很好用.
5.单目操作符
! 逻辑取反操作
- 负值
+ 正值
& 取地址
sizeof 操作符的类型长度(以字节为单位)
(类型) 强制转换
++ 前置++; 后置++
-- 前置--; 后置--
1>+和-可以表示算术运算,也可以表示数字的符号,
2>&取地址,在C语言中,创建变量时,系统内存会自动给变量分配一段存储空间,我们不能直接
访问这些变量,因为我们不知道他们的存储地址,需要使用&来找到变量的房间号,进而访问
所需要访问的变量;
3>sizeof() 是一种内存容量度量函数,功能是返回一个变量或者类型的大小(以字节为单位);
在 C 语言中,sizeof() 是一个判断数据类型或者表达式长度的运算符.
4> (类型)强制转换 : 1-(类型说明符)表达式***其功能是将表达式的运算结果强制转换为括号内的
类型说明符的类型;
2-不管是强制转换还是自动转换都是为了本次运算的需要而进行临时的转换;
不改变数据说明时对该变量定义的类型
void Test() {
int m = 1;
//m++
printf("%d
",m++);
//重置m的值为1
m = 1;
//++m
printf("%d
",++m);
}
自增运算符和自减运算符的前置后置区别:
后置++i : 在使用 i 之前先使 i 的值+1;
前置i++ : 在使用 i 之后再使 i 的值+1;
自减运算符同理.
6.关系运算符
分类 : > >= < <= == !=
说明 :
1-老生常谈:"=="和'='的区别,看起来啰嗦了一点,但是还是得说明一下;
2-对于一些复杂的关系表达式:b < a < c
不能直接表示,需要使用逻辑运算符: a > b && a < c;
为什么?未定义行为,C语言不支持.
7.条件运算符
//使用if-else判断两个数的较大值
if(a > b){
max = a;
}
else {
max = b;
}
//使用条件运算符" ? :"判断两个数的较大值
max = (a > b) ? a : b;
上面的两段代码都可以求出两个数的较大值,很明显,使用条件运算符的代码更简洁;
条件运算符: ? :
说明 : 条件运算符需要三个操作对象,每个操作对象都是一个表达式,通用形式为:
exp1 ? exp2 : exp3;
如果exp1为真,那么整个表达式的值为exp2,否则为exp3;
如: (5 > 3) ? 1 : 2; 值为1;
(3 > 5) ? 1 : 2; 值为2;
(a > b) ? a : b; 如果a > b,则取较大的值.
8.逗号运算符
逗号运算符把两个表达式连接成一个表达式,并保证最左边的表达式最先求值.
逗号运算符通常在for循环头的表达式中用于包含更多的信息,整个逗号表达式的值
是逗号右侧表达式的值;
#include<stdio.h>
int main(){
int i = 0;
i = 1, i = 10;
printf("i = %d
",i);
return 0;
}
输出结果为:
i = 10
9.数组下标引用
[ ]变址运算符或者称为下标引用操作符
操作形式: 数组名 + [索引值]
int arr[4] = {4,3,9,6};//注意索引值不能越界
printf("arr[3] = %d
",arr[3]);
//[ ]的两个操作数就是arr(数组名)和3(索引值)
10.函数调用操作符
接收一个或多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数;
#include<stdio.h>
void Test(){
printf("Hello BKY!
");
}
void Add(int x,int y){
printf("%d
",x+y);
}
int main(){
//第一种是没有参数传递的,直接函数名+();
Test();
//第二中是传参的形式,函数名+(参数1,参数2);
Add(10,20);
return 0;
}
11.结构体成员使用
访问一个结构体的成员有两种形式:
1> 结构体.成员名;
2> 结构体指针->成员名;
#define SIZE 100
struct Stu{
char num[SIZE];
char name[SIZE];
};
struct Stu Stu;
//使用结构体变量名引用成员
void Print_1() {
strcpy(Stu.num, "001");
strcpy(Stu.name, "飘雪");
printf("Stu.num = %s
",Stu.num);
printf("Stu.name = %s
",Stu.name);
}
struct Stu *p;
//使用结构体指针引用成员
void Print_2() {
p = &s
strcpy(p->num, "002");
strcpy(p->name, "无情");
printf("p->num = %s
",p->num);
printf("p->name = %s
",p->name);
}