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
% / 总结
  1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
  2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。只要有浮点数执行的就是浮点数除法。
  3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符

移位操作符包括左移<<,右移>>

  • 对正数而言左移相当于乘法,右移相当于除法
    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--操作符篇相关推荐

  1. Python语言入门这一篇就够了-学习笔记(十二万字)

    Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...

  2. C语言入门Part7--数组篇

    C语言入门Part7–数组篇 **关键字:**数组常见问题及注意事项总结,字符串定义,一维数组在内存中的存储,sizeof()求数组长度的注意事项,sizeof()的用法注意,sizeof()和str ...

  3. c语言圆周率计算_C语言入门这一篇就够了

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  4. 0-c语言入门这一篇就够了-学习笔记(一万字)

    内容来自慕课网,个人学习笔记.加上了mtianyan标签标记知识点. C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C ...

  5. c语言for循环除法运算,C语言入门这一篇就够了

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  6. c语言笔记照片_C语言入门这一篇就够了-学习笔记

    按照之前的计划,这篇文章本该写C语言简介,包括一些历史背景,发展状况, 语言特点什么的,这些东西着实比较啰嗦. 吃饭用的筷子,到现在我都不知道它的由来,不知道它是在什么历史背景下诞生的 有些东西还是有 ...

  7. Go语言入门——进阶语法篇(三)

    文章目录 进阶语法 指针 基本指针 高级指针 指针总结 面向对象 概述 对象 类 结构体 定义与初始化 添加方法 方法的注意事项 类型别名与类型定义的区别 工厂函数 接口 接口声明 接口实现 空接口 ...

  8. Go语言入门——环境准备篇(一)

    文章目录 环境准备篇 背景 Go开发环境搭建 下载 环境配置 IDE的选择 Go第一行代码 Go语言交叉编译 Go工程管理 欢迎关注我的公众号:编程之路从0到1 环境准备篇 背景 Go(又称Golan ...

  9. lua语言入门学习(一)搭建基本的环境并实现运行

    lua语言入门学习 本篇文章用来记录自己写lua语言的过程 文章目录 lua语言入门学习 前言 一.lua语言是什么? 二.使用步骤 1.搭建环境 2.开始运行 总结 前言 最近来到了一家网络游戏公司 ...

最新文章

  1. 整洁代码之道——重构
  2. linux——文件权限的更改与管理
  3. 在WebRTC上实现ML Kit笑容检测
  4. 使用Hexo搭建博客,备份至GitHub过程(基于网上资料的实践操作)
  5. MFC程序打开控制台
  6. python基础实训_python基础实践(三)
  7. 做优化的数据库工程师请参考!CynosDB的计算层设计优化揭秘
  8. Linux搭建svn服务
  9. 电商人:别再跟数据透视表苦苦挣扎,这个报表神器才是你最后出路
  10. java 程序路径_Java程序路径
  11. android 人脸识别边框_Android实现简单的人脸识别
  12. matlab高斯滤波跟中值滤波区别,基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比...
  13. mysql自动全量更新表_MySQL数据库自动全量备份脚本
  14. 什么是 yum?更改yum源 yum的相关命令
  15. 很多人遇到问题:win10锁屏唤醒后程序全部关闭
  16. Python 斐波那契数
  17. django项目 网易云音乐
  18. 4G图传移动视频取证-可视安全生产监管-常见问题解答FAQ-1,C/S客户端软件常用操作
  19. SQL Server AlwaysON从入门到进阶(1)——何为AlwaysON?
  20. javaweb——spring cloud分布式系统(1)搭建配置管理中心

热门文章

  1. 梦想还是要有的,即使被摧残着!
  2. 台式计算机怎么看有没有开独显,怎么看是集显还是独显?台式电脑应该怎么选择...
  3. 路由器android-267d3f,这才是真的高级货玩意:NETGEAR EX7700 AC2200三频无线Mesh扩展器使用体验...
  4. ACrush 楼天成的回忆录
  5. java.io.IOException: Incomplete output stream
  6. 色调、锐度、对比度、饱和度
  7. poj 3525 多边形内核,缩进
  8. 为什么ios比android快,那些说ios比Android快的,进来看看!
  9. ABP VNext学习日记6
  10. 更换Tomcat默认主页