前言:本文描述了C语言中的都有哪些操作符,这些操作符都有哪些用法。
文章目录
一、C语言中操作符划分
算数操作符, 移位操作符, 位操作符, 赋值操作符, 单目操作符, 关系操作符, 逻辑操作符, 条件操作符, 逗号操作符, 下标引用,函数调用,访问结构体成员操作符。
二、操作符的使用及注意事项
1. 算数操作符
算数操作符就是我们平常所见的 “+ - * / %”,
加,减,乘,除,取模运算。
除法运算时:
当两个数字都是整数时,运算的结果是整数,只要有其中一个数字是小数, 运算的结果才是小数。
#include <stdio.h>
int main()
{
int a = 10;
int b1 = 5;
float b2 = 5.0;
int c1 = a / b;
float c2 = a / b2;
printf("c1 = %d\n", c1);
printf("c2 = %d\n", c2);
return 0;
}
结果是:
c1 = 2
c2 = 2.0
2. 移位操作符
移位操作符有两个:
左移 <<
右移 >>
注意:移位操作符的操作数只能是整数。也就是往左移动整数个位数,往右移动整数个位数,不能移动小数个位数。并且,移位的位数不能为负数,否则报错!!
左移: 将整数的二进制数整体往左移动 n 位, 右边补0
右移:
- 逻辑右移: 将整数的二进制数整体往右移动 n 位,
左边补0
-算数右移: 将整数的二进制数整体往右移动 n 位,左边补符号位
2.1 数字在内存中的存储形式(原码, 反码, 补码)
移位操作符和位操作符需要用到用到原反补码的基础知识,如果不是特别理解,请查看:原码, 反码, 补码。
2.2 左移操作符和右移操作符
3. 位操作符
位操作符包括:
- & 按位与 (只有相同位数的两个数字都为1 时,才为 1)
- | 按位或 (只有相同位数的两个数字都为0时,才为0)
- ^ 按位异或(相同为0, 不同为1)
注意: 位操作符的操作数必须是整数
#include <stdio.h>
int main()
{
int a = 1; // a的二进制补码:00000000 00000000 00000000 00000001
int b = 2; // b的二进制补码:00000000 00000000 00000000 00000010
int c = a & b; // a&b二进制补码:00000000 00000000 00000000 00000000
int d = a | b; // a|b二进制补码:00000000 00000000 00000000 00000011
int e = a ^ b; // a^b二进制补码:00000000 00000000 00000000 00000011
printf("%d\n", c);//结果:0
printf("%d\n", d);//结果:3
printf("%d\n", e);//结果:3
return 0;
}
3.1 不创建临时变量交换两个数字
#include <stdio.h>
int main()
{
int a = 3;
int b = 4;
printf("交换前:a = %d, b = %d\n", a, b);
//不创建临时变量交换数字a 和 数字b
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a = %d, b = %d\n", a, b);
return 0;
}
结果是:
交换前:a = 3, b = 4
交换后:a = 4, b = 3
如下图所示:
4. 赋值操作符
赋值操作符就是“=”号,
- 注意:如果要表示两个数相等则用两个“=”,即两个“==”表示等于,一个“=” 表示赋值。
复合赋值操作符:
+=, -=, *=, /=, %=,<<=, >>=, &=, |=,^=
5. 单目操作符
! 逻辑反操作
~对一个数的二进制位按位取反
+正值
-负值
&取地址
++ 前置,后置++
– 前置,后置–
*间接访问操作符
(类型)强制转化类型
sizeof 操作数的类型长度(以字节为单位)
5.1 sizeof 计算操作数的类型的大小
- 例如:
sizeof(char) -> 1
sizeof(int)-> 4
sizeof(float)-> 4/8 (32位操作系统,占4个字节; 64位操作系统,占8个字节)
sizeof(double)-> 8
sizeof(long)-> 8
5.2 sizeof 和数组取地址&
数组名表示首元素的地址,但有两种情况,表示的时整个数组的地址
- sizeof(数组名), 此时数组名表示的是整个数组的地址
- & 数组名, 此时数组名也表示的是整个数组的地址
除此之外, 数组名表示的都是
数组的首元素的
地址。
6. 关系操作符
关系操作符有:
- ‘>’ 大于
- ‘<’ 小于
- ‘==’ 等于
- ‘>=’ 大于等于
- ‘<=’ 小于等于
- ‘!=’ 不等于
7. 逻辑操作符
逻辑操作符包括:
- 逻辑与: &&
- 逻辑或: ||
7.1 逻辑与和逻辑或的短路操作
如果判断左边为假了, 则&&后面的表达式不再计算
如果判断左边为真了, 则|后面的表达式不再计算
#include <stdio.h>
int main()
{
int i = 0,
int a = 0;
int b = 2;
int c = 3;
int d = 4;
i = a++ && ++b && d++;
// i = 0 &&... (a==1)
// && 左边表达式为假,整个表达式的结果为假, 右边表达式不计算
//所以整个表达式只执行了 a++, 即a = a + 1;
//i = a++||++b||d++; (或操作同理)
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
//输出的值为:1, 2, 3, 4
return 0;
}
8. 条件操作符
表达式1 ? 表达式2 : 表达式3
如果表达式1 为真, 则整个表达式的结果为表达式2 的结果,
如果表达式1 为假, 则整个表达式的结果为表达式3 的结果.
//使用条件表达式找出两个数的最大值
#include <stdio.h>
int main()
{
int a = 3;
int b = 4;
int max = (a>b) ? a : b;
printf("%d\n", max);
//max = 4;
return 0;
}
9. 逗号操作符
逗号表达式,就是用逗号隔开的多个表达式。
ret = (a+1, b, c, c+7, a==4, d = a+b);
从左向右依次计算,整个表达式的结果是最后一个表达式的结果.
ret = 依次计算之后, d = a+b 的结果
10. 下标引用,函数调用,访问结构体成员操作符
- 下标引用操作符 --> ‘[ ]’
- 操作数:一个数组名 + 一个索引值
- 例如: arr[2], 表示数组名为arr的下标为2的元素
- 函数调用操作符 --> ‘()’
- fun(), 调用fun函数, ()不能省略
- 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数.
3.访问一个结构的成员- . 结构体.成员名
- -> 结构体指针->成员名
三、总结
Ending:
- 基本的操作符的使用, 欢迎大家评论区讨论~