C语言入门Part8--操作符篇
C语言入门Part8–操作符篇
关键字: 各种操作符的介绍, 表达式求值(整型提升,算术转换)
- C语言入门part1
- C语言入门part2
- C语言入门part3
- C语言入门part4
- C语言入门part5
- C语言入门part6
- C语言入门part7
操作符
算数操作符
算数操作符包含+ - * / %,主要分析 / 和%
/ 除法运算符
printf("%f\n", 5 / 2);//结果为0.000000
printf("%d\n", 5 / 2);//结果为2
printf("%f\n", (flout)5 / 2);//结果为2.500000
printf("%f\n", 5 / (flout)2);//结果为2.500000
printf("%f\n", (flout)(5 / 2));//结果为2.000000
% 求模运算符
对应的两个操作数都必须是整型,不能是浮点数
printf("%d\n", 10%3);//1printf("%d\n", -10 % 3);//-1printf("%d\n", 10 % -3);//1printf("%d\n", -10 % -3);//-1
% / 总结
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。只要有浮点数执行的就是浮点数除法。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符
移位操作符包括左移<<,右移>>
- 对正数而言左移相当于乘法,右移相当于除法
11
0000 1011
左移
11<<1
0001 0110 , 22 , 11* 2^1
11<<2
0010 1100 , 44 , 11 * 2^2
右移
11>>1
0000 0101 , 5
11>>2
0000 0010 , 2
跟负数无关
-1 1111 1111
-1>>1 1111 1111 - 计算机中位运算速度远大于+ - * /
位操作符
- &按位与
11 0000 1011
13 0000 1101
ret 0000 1001 - |按位或
11 0000 1011
13 0000 1101
ret 0000 1111 - ^按位异或 不一样的时候进行或运算,一样的时候取0
11 0000 1011
13 0000 1101
ret 0000 0110 - 连续的数字异或可以消除重复
A^A = 0
(AA)B(CC) = B
位操作符的应用实例
实例一:不使用(a + b) / 2这种方式,求两个数的平均值。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int add(int m, int n)//实现两数的相加
{int ret = m ^ n;//1,0或0,1相加还为1int flag = m & n;//flag为进位标志 1,1相加会有进位while (flag != 0)//若flag不为0,则说明有进位 flag左移一位将进的1和ret再进行位运算,循环值无进位为止{flag = flag << 1;ret = ret ^ flag;flag = ret & flag;}return ret;
}
int div(int a, int b)//实现两数的平均值计算
{int ret;int m = ((a^b)>>1);//0,1或1,0相加求平均值时直接右移一位(二进制中右移一位相当于除以2)int n = a&b;//1,1相加求平均值还是原位放1,不用移位ret=add(m, n);//所以m+n就是求a,b平均值return ret;
}
int main()
{int a = 100;int b = 20;printf("a,b平均值为%d\n",div(a, b));return 0;
}
实例二:编程实现:一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。
//用位运算求非成对出现的数字
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{int arr[5] = {1,2,3,2,1};int len = sizeof(arr) / sizeof(arr[0]);int i = 0;for (i = 1; i < len; i++){arr[0] = arr[0] ^ arr[i];//连续的异或可以消除重复的元素 a^b^a=b 因为a^a=0,0^b=b}printf("只出现了一次的数字是%d\n", arr[0]);return 0;
}
实例三:求二进制1的个数
int NumberOf1(unsigned int num){int count = 0;while (num != 0){if ((num & 1) != 0){count++;}num=num >> 1;}return count;}
或
int NumberOf1(int num){int count = 0;while ( num!= 0){count++;num = (num & (num - 1));}return count;}
赋值操作符 =
还有些符合赋值操作符,如+=,-=,*=,/=,%=,>>=,<<=,
&=,|=,^=
单目操作符
! | 逻辑反操作 |
---|---|
- | 负值 |
+ | 正值 |
& | 取地址 |
sizeof | 操作数类型长度(以字节为单位) |
~ | 对一个数二进制按位取反 |
– | 前置后置减减 |
++ | 前置后置加加 |
* | 间接访问操作符(解引用操作符) |
(类型) | 类型强制转换 |
关系操作符
<,>,>=,<=,==,!=
注意不要把 == 和 =混淆
逻辑操作符
&& 逻辑与 也称短路与
|| 逻辑或 也称短路或
注意
- 表达式1&&表达式2
两表达式都为真才为真,表达式1为真表达式2才执行,若表达式1为假,则表达式2不执行 - 表达式1 || 表达式2
若表达式1为真,则后面不再执行,表达式1为假时,才执行表达式2
#include <stdio.h>
int main()
{int i = 0,a=0,b=2,c =3,d=4;i = a++ && ++b && d++;//最终执行结果 1 2 3 4//i = a++||++b||d++;//最终执行结果1 3 3 4printf("%d %d %d %d\n", a, b, c, d);return 0;
}
注意“=”是赋值符号,“==”判断相等,所以 i = a++
为假, i = a++ && ++b && d++;
表达式1为假后面不执行i = a++||++b||d++;
表达式1为假,执行++b,不为零所以表达式2为真,表达式3不执行
条件操作符
exp1 ? exp2 : exp3
表达式1是否为真,为真返回表达式2,假返回表达式3
应用:不能使用if for 大于 等于等语句,比较两个数的大小。大于返回1 小于返回-1 等于返回0
int Max(int a,int b)
{//return a > b ? a : b;//不能用<,>所以继续转变return (a-b)>>31 ? -1 : (a-b ? 1 : 0);//a,b都为int类型,(a-b)>>31判断符号位,为1(即为负数),说明a<b,返回-1;为0则说明a>=b,所以要继续判断a-b的值,不为0(a>b)返回1,为0(a=b)返回0
}
逗号表达式
逗号表达式每一个都要执行,但以最后一个表达式结果作为最终结果
下标引用、函数调用和结构成员
- 下标引用[] 和 函数调用()常用就不再赘述
- 访问一个结构的成员
.结构体.成员名
->结构体指针->成员名
struct Student
{char name[10];int age;
}stu={"caocao",99};//stu是一个全局变量
//结构体和数组都属于聚合类型 变量一旦定义,不可改变,整体初始化只有一次机会,所以不推荐定义stu或
struct Student
{char name[10];int age;
};
在main函数中
struct Student stu2={"caocao",99};//这样的话后续改年龄或者其他信息就可以直接改
stu2.age=199;//修改年龄或者
struct Student *pstu=NULL;
pstu-> //->指向符
表达式求值
- CPU运算的时候都是4个字节4个字节操作的 所以CPU运算的时候会进行整型提升(即表达式中各种长度小于四个字节的类型都要先转换为int类型或unsigned int类型)
- 整型提升无论正负高位都补符号位
无符号数高位补0
隐形整型提升例题
char a=0xb6;
short b=0xb600;
int c=0xb6000000;
if(a==0xb6)printf("a");//a要进行整型提升,提升后是负数
if(b==0xb600)printf("b");//b要进行整型提升,提升后是负数
if(c==0xb6000000)printf("c");//c不需要整型提升,所以结果为真,打印c
算术转换 尽可能转换为当前表达式中最大的类型
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。
C语言入门Part8--操作符篇相关推荐
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- C语言入门Part7--数组篇
C语言入门Part7–数组篇 **关键字:**数组常见问题及注意事项总结,字符串定义,一维数组在内存中的存储,sizeof()求数组长度的注意事项,sizeof()的用法注意,sizeof()和str ...
- c语言圆周率计算_C语言入门这一篇就够了
c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...
- 0-c语言入门这一篇就够了-学习笔记(一万字)
内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...
- c语言for循环除法运算,C语言入门这一篇就够了
c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...
- c语言笔记照片_C语言入门这一篇就够了-学习笔记
按照之前的计划,这篇文章本该写C语言简介,包括一些历史背景,发展状况, 语言特点什么的,这些东西着实比较啰嗦. 吃饭用的筷子,到现在我都不知道它的由来,不知道它是在什么历史背景下诞生的 有些东西还是有 ...
- Go语言入门——进阶语法篇(三)
文章目录 进阶语法 指针 基本指针 高级指针 指针总结 面向对象 概述 对象 类 结构体 定义与初始化 添加方法 方法的注意事项 类型别名与类型定义的区别 工厂函数 接口 接口声明 接口实现 空接口 ...
- Go语言入门——环境准备篇(一)
文章目录 环境准备篇 背景 Go开发环境搭建 下载 环境配置 IDE的选择 Go第一行代码 Go语言交叉编译 Go工程管理 欢迎关注我的公众号:编程之路从0到1 环境准备篇 背景 Go(又称Golan ...
- lua语言入门学习(一)搭建基本的环境并实现运行
lua语言入门学习 本篇文章用来记录自己写lua语言的过程 文章目录 lua语言入门学习 前言 一.lua语言是什么? 二.使用步骤 1.搭建环境 2.开始运行 总结 前言 最近来到了一家网络游戏公司 ...
最新文章
- 整洁代码之道——重构
- linux——文件权限的更改与管理
- 在WebRTC上实现ML Kit笑容检测
- 使用Hexo搭建博客,备份至GitHub过程(基于网上资料的实践操作)
- MFC程序打开控制台
- python基础实训_python基础实践(三)
- 做优化的数据库工程师请参考!CynosDB的计算层设计优化揭秘
- Linux搭建svn服务
- 电商人:别再跟数据透视表苦苦挣扎,这个报表神器才是你最后出路
- java 程序路径_Java程序路径
- android 人脸识别边框_Android实现简单的人脸识别
- matlab高斯滤波跟中值滤波区别,基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比...
- mysql自动全量更新表_MySQL数据库自动全量备份脚本
- 什么是 yum?更改yum源 yum的相关命令
- 很多人遇到问题:win10锁屏唤醒后程序全部关闭
- Python 斐波那契数
- django项目 网易云音乐
- 4G图传移动视频取证-可视安全生产监管-常见问题解答FAQ-1,C/S客户端软件常用操作
- SQL Server AlwaysON从入门到进阶(1)——何为AlwaysON?
- javaweb——spring cloud分布式系统(1)搭建配置管理中心
热门文章
- 梦想还是要有的,即使被摧残着!
- 台式计算机怎么看有没有开独显,怎么看是集显还是独显?台式电脑应该怎么选择...
- 路由器android-267d3f,这才是真的高级货玩意:NETGEAR EX7700 AC2200三频无线Mesh扩展器使用体验...
- ACrush 楼天成的回忆录
- java.io.IOException: Incomplete output stream
- 色调、锐度、对比度、饱和度
- poj 3525 多边形内核,缩进
- 为什么ios比android快,那些说ios比Android快的,进来看看!
- ABP VNext学习日记6
- 更换Tomcat默认主页