目录

一、算术操作符

二、移位操作符

三、位操作符

四、赋值操作符

五、单目操作符

六、关系操作符

七、逻辑操作符

八、条件操作符

九、逗号表达式

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

以上就是C语言中涉及到得操作符,我将用代码实例配合说明,小伙伴们在学习操作符的时候,一定要去编译器里动手实践一下,可以帮助大家更好的理解每一个操作符。

一、算术操作符

+        -        *        /        %

1、加法(+)

#include <stdio.h>
int main()
{int a = 0;int b = 0;int c = 0;a = 1 + 2;//加法两边可以是常量a = b + c;//也可以是变量printf("%d", 1 + 2);//这里打印的是3,而不是整个表达式return 0;
}

2、减法(-)

#include <stdio.h>
int main()
{int a = 0;a = 5 - 3;//减法运算就是让减号左边的数减去右边的数printf("%d", a);//结果是屏幕上打印2return 0;
}

3、乘法(*)

#include <stdio.h>
int main()
{int a = 1;int b = 0;b = a * a;//和数学中的乘法一样,但是在计算机中,乘号用*来表示printf("%d", b);//结果是1return 0;
}

4、除法(/)

例如:我们想在计算机中打印5除以3的值

首先你可能会这么写:

#include <stdio.h>
int main()
{int a = 0;a = 5 / 3;printf("%d", a);return 0;
}

是的,当我们运行程序后,发现屏幕上只打印了一个1,后面的小数部分丢失了!

原因是a的类型是整型,用来存放整数,自动将小数部分丢失,这一过程叫做截断。那么我们是否可以用一个浮点类型的变量来存放结果呢?

#include <stdio.h>
int main()
{float a = 0.0;a = 5 / 3;printf("%f", a);//注意打印flaot类型的数要用%freturn 0;
}

在我们运行之后发现,结果是1.00000,依旧没有我们想要的小数的值

原因是,我们确实是创建了一个浮点类型的变量,但是编译器在执行5/3的时候,依旧是一个整形的表达式,在赋给a之前,它的小数部分依旧丢失了!

所以我们做如下改进:

#include <stdio.h>
int main()
{float a = 0.0;a = 5.0 / 3;//我们让其中的一个数,成为浮点数printf("%f", a);//注意打印flaot类型的数要用%freturn 0;
}

这回我们得到了我们想要的结果!

所以我们要注意:对于(/)操作符来说,如果两个操作数都是整数,那么就执行整数除法,而只要两个操作数中有一个数是浮点数,那么就执行浮点数除法。

5、求模运算符(%)

对于求模运算符来说,其运算结果是,两个数做除法,取他们的余数,特别要注意:%操作符的操作数,必须是整数。

#include <stdio.h>
int main()
{int a = 0;a = 13 % 5;//读作13求模5,必须是整数printf("%d", a);//打印的结果13除以5的余数,也就是3return 0;
}

二、移位操作符

<<        >>

1、左移操作符(<<)

在移位操作中,移的位都是二进制位,所以我们如果拿到一个非二进制的数,我们要先把他转换成二进制数。

如图就是左移的详细过程,先把10转化成32位二进制序列,移位规则就是:左移一位,左边丢弃,右边补一个0,我们可以用一个代码来验证结果。

#include <stdio.h>
int main()
{int a = 10;int b = 0;b = a << 1;//左移一位printf("%d\n", b);printf("%d\n", a);
}

运行之后,发现第一行打印20,第二行打印10,所以我们可以知道,左移的确是将左边的位丢弃,右边补0,但是,对于被操作的a本身来说,它的值并不会被改变。

2、右移操作符(>>)

在了解右移操作符之前,我们要先了解一下原码,反码,补码的概念。

在计算机中,一个负数的存储是以它的补码的形式来存储的。(正整数的原、反、补都一样)

原码:直接写成二进制序列

反码:原码的符号位不变,其他位按位取反

补码:反码每一位+1,得到补码

例如:-1

原码:10000000000000000000000000000001    注:这里最左边的1,是符号位,正0,负1

反码:1111111111111111111111111111111111110

补码:1111111111111111111111111111111111111

右移运算可以分为两类,逻辑右移和算术右移

#include <stdio.h>
int main()
{int a = -1;int b = 0;//把a的二进制位向右移动一位b = a >> 1;printf("%d", b);
}

大家可以在自己的编译器里,编写这个代码,验证一下,它在你的编译器里是逻辑右移还是算术右移。

三、位操作符

&        |        ^

1、按位与(&)

#include <stdio.h>
int main()
{int a = 3;int b = 5;int c = 0;c = a & b;//按(2进制位)位与//规则:对应位都是1,按位与为1,只要有一个不是1,那么按位与为0//a:00000000000000000000000000000011//b:00000000000000000000000000000101//a&b:00000000000000000000000000000001printf("%d", c);return 0;
}

2、按位或(|)

#include <stdio.h>
int main()
{int a = 3;int b = 5;int c = 0;c = a | b;//按(2进制位)位或//规则:对应位只要有一个1,那么就按位或为1//a:00000000000000000000000000000011//b:00000000000000000000000000000101//a|b:00000000000000000000000000000111printf("%d", c);return 0;
}

3、按位异或(^)

#include <stdio.h>
int main()
{int a = 3;int b = 5;int c = 0;c = a ^ b;//按(2进制位)位异或//规则:对应位,相同为0,相异为1//a:00000000000000000000000000000011//b:00000000000000000000000000000101//a|b:00000000000000000000000000000110printf("%d", c);return 0;
}

四、赋值操作符

=        +=        -=        *=        /=        %=        >>=        <<=        &=        |=        ^=

"="用来赋值

int a = 0;//把0赋值给a

其余的为复合赋值

例如:

x = x + 1;
x += 1;

上面这两种写法是完全等价的,复合赋值就是为了简洁,每一个符合赋值的运算符道理都和上面的一样。

五、单目操作符

!        -        +        &        sizeof        ~        --        ++        *        (类型)

1、逻辑反操作(!)

常用于判断中

int i = 0;
if(!i)      //!0即为真
{printf("nihao");
}

这行代码的意思是,如果i的逻辑反为真值,就执行if语句中的语句。

2、负值(-)

#include <stdio.h>
int main()
{int a = 3;a = -a;printf("%d", a);return 0;
}

3、正值(+)

#include <stdio.h>
int main()
{int a = 3;a = +a;//正数通常省略+printf("%d", a);return 0;
}

4、取地址(&)

用来取地址

#include <stdio.h>
int main()
{int a = 10;printf("%p\n", &a);//用来取出a在内存中的地址,打印地址用%preturn 0;
}

5、sizeof(求操作数的类型长度,以字节为单位)

int main()
{int a = 3;printf("%d", sizeof(a));//计算int类型的长度return 0;
}

6、按位取反(~)

#include <stdio.h>
int main()
{int a = -1;a = ~a;//10000000000000000000000000000001  --原码//11111111111111111111111111111110  --反码//11111111111111111111111111111111 --补码//按位取反//11111111111111111111111111111111    --内存中的a//00000000000000000000000000000000   --取反之后printf("%d", a);return 0;
}

7、自减(--)

#include <stdio.h>
int main()
{int a = 3;int b = 0;int c = 0;b = a--;//后置--,先使用,再--c = --a;//前置--,先--,后使用printf("%d\n", b);//3printf("%d\n", c);//1return 0;
}

8、自增(++)

#include <stdio.h>
int main()
{int a = 3;int b = 0;int c = 0;b = a++;//后置++,先使用,再++c = ++a;//前置++,先++,后使用printf("%d\n", b);//3printf("%d\n", c);//5return 0;
}

9、间接访问(*)

#include <stdio.h>
int main()
{int a = 10;int* pa = &a;//创建一个指针变量*pa = 20;//*--解引用操作符-间接访问操作符printf("%d\n", a);//20return 0;
}

10、强制类型转换((类型))

#include <stdio.h>
int main()
{int a = (int)3.14;//将double类型强制转换为整型printf("%d\n", a);return 0;
}

六、关系操作符

>         大于

>=       大于或等于

<         小于

<=       小于或等于

!=        不等于

==        等于

这些关系操作符与数学中的符号意思一样,通常用来进行判断

特别注意“==”和“=”不一样

七、逻辑操作符

&&        ||

1、逻辑与(&&)

用来表示并且

只有&&两边的表达式均为真,才表示真

例如:1&&3  为真

1&&0   为假

2、逻辑或(||)

只要||一边的表达式为真,整个表达式就为真

例如:1||0    为真

八、条件操作符

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

条件操作符又称为三目操作符

可以解读为,如果表达式1成立,则执行表达式2的值,否则执行表达式3的值

#include <stdio.h>
int main()
{int a = 3;int b = 5;int max = (a > b ? a : b);//用来找到两数的较大值printf("%d\n", max);return 0;
}

九、逗号表达式

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

逗号表达式,顾名思义就是用逗号隔开的表达式

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

#include <stdio.h>
int main()
{int a = 3;int b = 5;int c = (a + b, b + 1, a++);//最后一个表达式的值printf("%d\n", c);//3return 0;
}

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

1、下标引用([])

用于数组,操作数:一个是数组名,另一个是下标

#include <stdio.h>
int main()
{int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };printf("%d", arr[4]);//[下标]用来访问数组中第5个元素return 0;
}

2、函数调用

#include <stdio.h>
void test()
{printf("nihao");
}
int main()
{test();//()作为函数调用的操作符return 0;
}

3、访问结构成员

.        结构体.成员名

#include <stdio.h>
struct Book
{char name[20];char id[10];int price;
};
int main()
{struct Book b = { "nihao","KN16798",10 };printf("%s\n", b.name);printf("%s\n", b.id);printf("%d\n", b.price);return 0;
}

->      结构体->成员名

#include <stdio.h>
struct Book
{char name[20];char id[10];int price;
};
int main()
{struct Book b = { "nihao","KN16798",10 };struct Book* pb = &b;printf("%s\n", pb->name);printf("%s\n", pb->id);printf("%d\n", pb->price);return 0;
}

以上就是C语言中涉及的操作符,有问题的小伙伴可以在评论区讨论。

C语言——操作符详解相关推荐

  1. C语言操作符详解 隐式类型转换 (整型提升 算数转换)

    目录 一.算术操作符 二.左移操作符 右移操作符 1.二进制序列 2.左移操作符 3.右移操作符 3.1.逻辑运算/算术运算 3.2.对于移位运算符,不要移动负数位,这是标准未定义的 3.3.对于移位 ...

  2. C语言操作符详解------移位操作符

    今天给大家带来的是移位操作符的详解 首先大家在学习移位操作符之前要明确:移位操作符移动的是二进制位!!! <<   左移操作符 >>   右移操作符 注意:移位操作符的操作数只 ...

  3. C#语言入门详解笔记(5)—P10、P11、P12 操作符详解_1_2_3

    C#语言入门详解_哔哩哔哩_bilibiliC#语言入门详解搬运,随youtube上进度更新.刘老师的C#视频教程到30集就告一段落了,感谢刘老师在这5年间的付出.能上youtube的同学可以去刘老师 ...

  4. C语言基础之操作符详解

    C语言基础之操作符详解 操作符的分类 算术操作符 移位操作符 位操作符 逻辑操作符 逗号表达式 表达式求值 隐式类型转换 算术转换 操作符的属性 xwg今天就带各位大佬来了解一波C语言的操作符. 操作 ...

  5. 【C语言】操作符详解(超详细)

    hello~~,我是~小鹿,超级详细的操作符讲解来康康吧 可以收藏随时找到这里哦~ [C语言]操作符详解(超详细) 1.算数操作符:+,-,*,/,% 2.位移操作符:<< , >& ...

  6. C语言学习笔记—P13(操作符详解<1>+图解+题例)

    目录 前言:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教! --By 作者:新晓·故知 操作符详解<1>:​ 题例: 1. 操作符分类: 算术操作符 移位操作 ...

  7. C#语言入门详解1-12

    可供参考的别人的学习笔记:https://blog.csdn.net/Jacey_cai/article/details/122848272 文章目录 一.课程简介.C#语言简介.开发环境准备 二.初 ...

  8. C语言位操作详解-4.2.C语言专题第二部分-朱有鹏-专题视频课程

    C语言位操作详解-4.2.C语言专题第二部分-11753人已学习 课程介绍         本课程的目标是让大家彻底掌握C语言中位运算符及常规技巧,这些知识在嵌入式代码中用的很多,尤其是设置寄存器以操 ...

  9. 完结篇:操作符详解(2)

    目录 一.单目操作符 1.!  逻辑反操作 补充:布尔类型 2.& 取地址操作符 3.* 间接访问操作符(解引用操作符) 4.sizeof 计算操作数的类型长度 5.~ 操作符 操作符的结合使 ...

最新文章

  1. python怎么保存数据框转置结果_python – 如何转置pandas数据帧以交叉制表保存所有值的数据帧...
  2. 《随笔记录》20170310
  3. mysql 查看表是否存在_MySQL优化篇二
  4. 【kafka】kafka 零拷贝 技术
  5. 关于css中列表(ul ol)存在默认间距的问题
  6. 为什么我不建议你用去 “ ! = null “ 做判空?
  7. MySQL存储引擎InnoDB、MyISAM 、其它存储引擎介绍
  8. 常用的 T-SQL 语言
  9. http隧道Chisel
  10. java poi word 复制_java poi如何复制word中的table
  11. 美团 O2O 供应链系统架构设计解析
  12. 阿里云服务安装FTP服务器报200 227 entering passive mode(被动模式)错误
  13. Android视频监控!!!随时随地监控你的家庭
  14. Keil5创建工程(STM32F407)
  15. 显示器颜色偏色的排查过程(偏黄、偏红、偏蓝、偏绿等)
  16. JAVA软件技术人力外派外包费用怎么算?
  17. canvas实战——WPS分享PDF文件的小图标
  18. 【EVE-NG】模拟器打不开/分不到地址
  19. 《设计模式之禅》-建造者模式
  20. 魔兽世界以前的服务器找不到了,魔兽世界怀旧服服务器彻底崩溃,玩家游戏人物消失服务器全部不见...

热门文章

  1. 罗曼冲牙器W6维修记录
  2. spring starter原理和实例
  3. python微信好友比例分析_python分析微信好友分布
  4. MES系统在医疗器械行业的应用
  5. 什么是WindowServer进程,为什么它在Mac上运行?
  6. HTML5期末大作业:苏苏网站设计——仿苏苏超市(1页) 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  7. Windows 10 作为无线显示器无法被搜索到
  8. 安卓手机的touchend事件不触发问题
  9. 工厂系列系统之 MES 系统14 总结
  10. 1添加最简单的Linux内核模块