C语言中的操作符详解

前言:本文描述了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 和数组取地址&

数组名表示首元素的地址,但有两种情况,表示的时整个数组的地址

    1. sizeof(数组名), 此时数组名表示的是整个数组的地址
    1. & 数组名, 此时数组名也表示的是整个数组的地址

除此之外, 数组名表示的都是数组的首元素的地址。

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. 下标引用,函数调用,访问结构体成员操作符

  1. 下标引用操作符 --> ‘[ ]’
  • 操作数:一个数组名 + 一个索引值
  • 例如: arr[2], 表示数组名为arr的下标为2的元素
  1. 函数调用操作符 --> ‘()’
  • fun(), 调用fun函数, ()不能省略
  • 接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数.
    3.访问一个结构的成员
  • . 结构体.成员名
  • -> 结构体指针->成员名

三、总结

Ending:

  • 基本的操作符的使用, 欢迎大家评论区讨论~
  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值