C语言——操作符详解
目录
一、算术操作符
二、移位操作符
三、位操作符
四、赋值操作符
五、单目操作符
六、关系操作符
七、逻辑操作符
八、条件操作符
九、逗号表达式
十、下标引用、函数调用和结构成员
以上就是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语言——操作符详解相关推荐
- C语言操作符详解 隐式类型转换 (整型提升 算数转换)
目录 一.算术操作符 二.左移操作符 右移操作符 1.二进制序列 2.左移操作符 3.右移操作符 3.1.逻辑运算/算术运算 3.2.对于移位运算符,不要移动负数位,这是标准未定义的 3.3.对于移位 ...
- C语言操作符详解------移位操作符
今天给大家带来的是移位操作符的详解 首先大家在学习移位操作符之前要明确:移位操作符移动的是二进制位!!! << 左移操作符 >> 右移操作符 注意:移位操作符的操作数只 ...
- C#语言入门详解笔记(5)—P10、P11、P12 操作符详解_1_2_3
C#语言入门详解_哔哩哔哩_bilibiliC#语言入门详解搬运,随youtube上进度更新.刘老师的C#视频教程到30集就告一段落了,感谢刘老师在这5年间的付出.能上youtube的同学可以去刘老师 ...
- C语言基础之操作符详解
C语言基础之操作符详解 操作符的分类 算术操作符 移位操作符 位操作符 逻辑操作符 逗号表达式 表达式求值 隐式类型转换 算术转换 操作符的属性 xwg今天就带各位大佬来了解一波C语言的操作符. 操作 ...
- 【C语言】操作符详解(超详细)
hello~~,我是~小鹿,超级详细的操作符讲解来康康吧 可以收藏随时找到这里哦~ [C语言]操作符详解(超详细) 1.算数操作符:+,-,*,/,% 2.位移操作符:<< , >& ...
- C语言学习笔记—P13(操作符详解<1>+图解+题例)
目录 前言:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教! --By 作者:新晓·故知 操作符详解<1>: 题例: 1. 操作符分类: 算术操作符 移位操作 ...
- C#语言入门详解1-12
可供参考的别人的学习笔记:https://blog.csdn.net/Jacey_cai/article/details/122848272 文章目录 一.课程简介.C#语言简介.开发环境准备 二.初 ...
- C语言位操作详解-4.2.C语言专题第二部分-朱有鹏-专题视频课程
C语言位操作详解-4.2.C语言专题第二部分-11753人已学习 课程介绍 本课程的目标是让大家彻底掌握C语言中位运算符及常规技巧,这些知识在嵌入式代码中用的很多,尤其是设置寄存器以操 ...
- 完结篇:操作符详解(2)
目录 一.单目操作符 1.! 逻辑反操作 补充:布尔类型 2.& 取地址操作符 3.* 间接访问操作符(解引用操作符) 4.sizeof 计算操作数的类型长度 5.~ 操作符 操作符的结合使 ...
最新文章
- python怎么保存数据框转置结果_python – 如何转置pandas数据帧以交叉制表保存所有值的数据帧...
- 《随笔记录》20170310
- mysql 查看表是否存在_MySQL优化篇二
- 【kafka】kafka 零拷贝 技术
- 关于css中列表(ul ol)存在默认间距的问题
- 为什么我不建议你用去 “ ! = null “ 做判空?
- MySQL存储引擎InnoDB、MyISAM 、其它存储引擎介绍
- 常用的 T-SQL 语言
- http隧道Chisel
- java poi word 复制_java poi如何复制word中的table
- 美团 O2O 供应链系统架构设计解析
- 阿里云服务安装FTP服务器报200 227 entering passive mode(被动模式)错误
- Android视频监控!!!随时随地监控你的家庭
- Keil5创建工程(STM32F407)
- 显示器颜色偏色的排查过程(偏黄、偏红、偏蓝、偏绿等)
- JAVA软件技术人力外派外包费用怎么算?
- canvas实战——WPS分享PDF文件的小图标
- 【EVE-NG】模拟器打不开/分不到地址
- 《设计模式之禅》-建造者模式
- 魔兽世界以前的服务器找不到了,魔兽世界怀旧服服务器彻底崩溃,玩家游戏人物消失服务器全部不见...