操作符详解-C语言

目录

一、操作符分类

二、算术操作符

三、移位操作符

[3.1. 左移操作数](#3.1. 左移操作数)

[3.2 右移操作符](#3.2 右移操作符)

四、位操作符

五、赋值操作符

六、单目操作符

七、关系操作符

八、逻辑操作符

九、条件操作符

十、逗号表达式

十一、下标引用函数调用和结构体成员


一、操作符分类

操作符分为算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式和下标引用、函数调用与结构体成员。

二、算术操作符

    • * / %

除% 操作符 外,其他操作符可以作用于整数和浮点数/ 操作符 ,如果两个操作数都为整数,执行整数除法 ,而只要有浮点数就执行浮点数除法% 操作符的两个操作数必须为整数,返回的是整除之后的余数。

三、移位操作符

<< 左移操作符

>> 右移操作符

移位操作符的操作数只能是整数。

3.1. 左移操作数

移位规则:丢弃最左边,在最右边补0

3.2 右移操作符

右移分为两种:1.逻辑右移:最左边用0填充,丢弃最右边 ;2**.算数移位:最左边填充该值的符号位,丢弃最右边**。

不能移动负数位,这是标准为定义,使用会出错。

四、位操作符

& 按位与 | 按位或 ^按位异或

操作数必须是整数。

示例 求一个整数存储在内存中的二进制中1的个数

#include <stdio.h>

//方法1

int main()

{

int num = 10;

int count=0;

while(num)

{

if(num%2 == 1)

count++;

num = num/2;

}

printf("二进制中1的个数 = %d\n", count);

return 0;

}

//方法2

int main()

{

int num = -1;

int i = 0;

int count = 0;

for(i=0; i<32; i++)

{

if( num & (1 << i) )

count++;

}

printf("二进制中1的个数 = %d\n",count);

return 0;

}

//方法3

int main()

{

int num = -1;

int i = 0;

int count = 0;

while(num)

{

count++;

num = num&(num-1);

}

printf("二进制中1的个数 = %d\n",count);

return 0;

}

五、赋值操作符

= 赋值操作符
int a=10;

复合赋值符

+= -= *= /= %= >>= <<= &= |= ^=
int x=10;

x=x+10;

x+=10;//达到上述同样效果

六、单目操作符

! 逻辑反操作 - 负值 + 正值 & 取地址 sizeof 操作数类型长度

~ 对一个数的二进制按位取反 -- 前置、后置-- ++前置、后置++

* 间接访问操作符(解引用操作) (类型) 强制类型转化

示例

int main()

{

int a = -10;

int* p = NULL;

printf("%d\n", !2);//0

printf("%d\n", !0);//1

a = -a;

p = &a;

printf("%d\n", sizeof(a));//4

printf("%d\n", sizeof(int));//4

printf("%d\n", sizeof a);//4

printf("%d\n", sizeof int);//报错

return 0;

}
int main()

{

int a = 10;

int x = a++;//先使用,再增加,这样x的值是10;之后a变成11;--同理

int y = ++a;//先自增,再使用,这样a的值是11;之后y变成11;--同理

return 0;

}

七、关系操作符

> >= < <= !=(不等于) ==

八、逻辑操作符

&& 逻辑与 || 逻辑或
1&2----->0 按位与

1&&2---->1 逻辑与

1|2----->3 按位或

1||2---->1 逻辑或

逻辑与特点:在表达式1&&表达式2中,只要表达式1为假(0)结果就为假(0),后面语句不在执行。

int main()

{

int i = 0, a = 0, b = 2, c = 3, d = 4;

i = a++ && ++b && d++;

printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);

return 0;

}

逻辑或特点:在表达式1 || 表达式2中,只要表达式1为真(非0),结果就为真(非0),后面语句不再执行。

int main()

{

int i = 0, a = 0, b = 2, c = 3, d = 4;

i = a++||++b||d++;

printf(" a = %d\n b = %d\n c = %d\n d = %d\n", a, b, c, d);

return 0;

}

九、条件操作符

表达式1?表达式2:表达式3

如果表达式1为真(非0)结果为表达式2的结果,否则为表达式3的结果。

十、逗号表达式

表达式1,表达式2,表达式3,表达式4,......

逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。

int main()

{

int a = 1;

int b = 2;

int c = (a > b, a = b + 10, a, b = a + 1);

printf("%d", c);

return 0;

}

十一、下标引用函数调用和结构体成员

1. 下标引用操作符,操作数:数组名和索引值

int arr10;

arr9 = 10;

2.函数调用操作符

接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。

void test1()

{

printf("hehe\n");

}

void test2(const char *str)

{

printf("%s\n", str);

}

int main()

{

test1();

test2("hello bit.");

return 0;

}

3.访问结构体成员

. 结构体名.成员名 -> 结构体指针->成员名

struct Stu

{

char name10;

int age;

char sex5;

double score;

};

void set_age1(struct Stu stu)

{

stu.age = 18;

}

void set_age2(struct Stu* pStu)

{

pStu->age = 18;//结构成员访问

}

int main()

{

struct Stu stu;

struct Stu* pStu = &stu;

stu.age = 20;

set_age1(stu);

pStu->age = 20;

set_age2(pStu);

return 0;

}

相关推荐
ZJU_统一阿萨姆2 小时前
【推理优化进阶】性能实验科学:工作负载、统计显著性与尾延迟归因
开发语言·人工智能·语言模型·系统架构·vllm
Hhy_11072 小时前
《C++深度解构02》类和对象(上)——定义规范、内存对齐与 this 指针全解
c语言·开发语言·c++·学习·visual studio
电子云与长程纠缠2 小时前
UE5 Lyra PocketWorld进行3D内容UI预览 - 下
开发语言·学习·游戏·ui·ue5
平常心的技术小牛2 小时前
Qt-快速上手-QLabel
开发语言·qt
XR1234567882 小时前
工厂办公楼无线网络:多楼层覆盖与访客体验怎么选?
开发语言·php
JL152 小时前
Java并发编程面试全攻略-从synchronized到AQS底层原理
java·开发语言·面试·并发编程
云泽8082 小时前
Python 开发环境搭建全指南:从 Python 安装到 PyCharm 配置详解
开发语言·python·pycharm
不会代码的小猴3 小时前
2. 了解Qt
开发语言·c++·笔记·qt·算法
ZJU_统一阿萨姆3 小时前
【推理优化进阶】Hopper_Blackwell 微架构:从指令、流水线到真实性能上限
开发语言·人工智能·语言模型·架构·开源
程序喵大人5 小时前
【C++进阶】STL算法与函数对象 - 09 函数对象保存状态并复用规则
开发语言·c++·算法·stl·函数对象