C语言基础之操作符详解

  • 操作符的分类
    • 算术操作符
    • 移位操作符
    • 位操作符
    • 逻辑操作符
    • 逗号表达式
  • 表达式求值
    • 隐式类型转换
    • 算术转换
    • 操作符的属性

xwg今天就带各位大佬来了解一波C语言的操作符。

操作符的分类

常见的操作符分别如下:

  1. 算术操作符
  2. 移位操作符
  3. 位操作符
  4. 逻辑操作符
  5. 逗号表达式

算术操作符

算术操作符是我们最常用的操作符:+ - * / %
注:

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

移位操作符

移位操作符分为左移操作符和右移操作符,移位操作符的操作对象只能是整数,且所谓的移位是对于整数的二进制位进行移位:
左移操作符:<<
右移操作符:>>

  1. 左移操作符:
    移位规则:左边抛弃,右边补0
  2. 右移操作符:
    移位规则:
    2.1 逻辑移位
    左边用0填充,右边丢弃
    2.2算术移位
    左边用原该值的符号位填充,右边丢弃
    注:大部分编译器右移都是执行算术右移。

注:对于移位运算符,不要移动负数位,这个是标准未定义的。

位操作符

位操作符有:

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

位操作符的操作数必须是整数,且是对其二进制的补码进行操作。
异或的基本性质:

  1. 0异或上任何数为其本身:0^2=2
  2. 任何数异或上其本身等于0:2^2=0

例:不创建临时变量使两个数进行交换

#include <stdio.h>
int main()
{int a = 10;int b = 20;a = a^b;b = a^b;a = a^b;printf("a = %d b = %d\n", a, b);return 0;
}

逻辑操作符

逻辑操作符分为:

&& —— 逻辑与
|| —— 逻辑或

逻辑与:
必须使 && 左右两个表达式都为真

逻辑或:
|| 两边有一个式子为真即为真

逗号表达式

逗号表达式是用逗号隔开的多个表达式:
exp1, exp2, exp3, …expN
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。

表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定,但是,有些表达式的操作数在求值的过程中可能需要转换为其他类型。

隐式类型转换

C语言的整型算术运算总是至少以缺省整型类型的精度来进行的,为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。

实例:

char a,b,c;
...
a = b + c;

b和c的值被提升为普通整型,然后再执行加法运算,加法运算完成之后,结果将被截断,然后再存储于a中。

整形提升是按照变量的数据类型的符号位来提升的,若操作对象为正数则补0,操作对象为负数则补1。

负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111

正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001

无符号整形提升,高位补0

int main()
{char a = 5;//存在char、short计算时发生整形提升//00000000000000000000000000000101//截断后//00000101 - a//整型提升后(整形提升是按照变量的数据类型的符号位来提升的)//00000000000000000000000000000101char b = 126;//00000000000000000000000001111110//01111110 - b//整型提升后//00000000000000000000000001111110char c = a + b;//00000000000000000000000000000101//00000000000000000000000001111110//00000000000000000000000010000011//11111011 - c//整形提升后//11111111111111111111111110000011 - 补码//11111111111111111111111110000010 - 反码//10000000000000000000000001111101 - 原码printf("%d\n", a + b);
}

算术转换

如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。

下面的层次体系称为寻常算术转换:

long double
double
float
unsigned long int
long int
unsigned int
int

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

操作符的属性

复杂表达式的求值有三个影响的因素。

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序。

两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。

C语言基础之操作符详解相关推荐

  1. C语言最全操作符详解,一文精通所有操作符!

    文章目录 前言 一.除号"/" 二."%"除法取余数 三.左移操作符"<<"和右移操作符">>" ...

  2. c语言智力题 操作符详解例题 数据存储 指针初阶 水仙花数 杨辉三角 逆序字符串 喝汽水问题 打印图形 猜凶手 使用指针打印数组内容 调整奇数偶数顺序 运动员猜名次

    [题目名称] 下面代码的结果是:a #include <stdio.h> int i; int main() {i--; //sizeof'的返回值是无符号整型if (i > siz ...

  3. 【C语言】sizeof操作符详解

    sizeof概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符+.-等:它并不是函数. 作用: 用于计算类型或者变量所占空间的大小(以字节为单位) 那么字节又是什么? 字节(Byte ) ...

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

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

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

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

  6. [系统安全] 四十四.APT系列(9)Metasploit技术之基础用法万字详解及防御机理

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  7. [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. 基础拾遗------webservice详解

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  9. java文档注释定界符_c语言的注释定界符详解

    c语言的注释定界符详解 c语言的注释定界符是什么 1.最早期的C语言注释是:/* */ 2.后来又增加的行注释:// 其中/**/是多行注释,//是单行注释. 需要注意的是:C 语言的注释并不是可以出 ...

最新文章

  1. cocos2d-x游戏实例(16)-纵版射击游戏(3)
  2. phpstorm安装_快速打造自己的PHPStorm主题
  3. 单片机中断程序实例_单片机定时器中断实现长时间定时程序
  4. 两数之和,输入有序数组 leetcode C++
  5. Replace Parameter with Explicit Methods(以明确函数取代参数)
  6. WCF分布式开发常见错误(13):此方法调用的事务被异步中断
  7. openstack: No valid host was found. There are not enough hosts available
  8. 计算机相关专业的学生如何规划自己的职业?
  9. 福昕阅读器注册无法连接服务器,福昕pdf阅读器 10安装使用教程(附注册机)
  10. resource failed to call close
  11. pion ice项目源码分析
  12. 前端工程的价值体现在哪里
  13. 堡垒机的主要功能是什么?为什么需要堡垒机?
  14. JDK8与JDK9新特性学习
  15. 关于Alphago zero,是的,我来跟风了
  16. ZZULIOJ:1011圆柱体表面积
  17. 【日常计算机问题】解决能使用网络但打不开网页的问题
  18. 计算机重装后如何连接无线网络,笔记本系统重装后无线连接不见了怎么办
  19. 移动办公邮箱app,怎么设置邮件归档?
  20. 打开天正显示服务器连接不可用,打开天正提示找不到可用cad版本 - 卡饭网

热门文章

  1. 为什么要创建额外的堆
  2. JAVA关于搜索附近功能开发探讨
  3. 名悦集团:贷款买车和全款买车选哪个好,这笔账怎么算
  4. Spring MVC过滤器-HiddenHttpMethodFilter
  5. java 遍历目录下所有文件_java实现遍历某个目录(包括子目录)下的所有文件
  6. Testing the mettle
  7. Arcgis更换布局模板_Typecho 主题更换及优秀主题推荐
  8. 阿里云【达摩院特别版·趣味视觉AI训练营】笔记1
  9. 时光印象AR相册使用说明
  10. 移动端IOS使用EasyAr实现非unity(unity)案例介绍