【C语言入门教程】2.6 运算符
运算符是程序中用于数值运算的操作符,C 语言的运算符可分为 算术运算符、关系与逻辑运算符 和 位操作运算符 这 3 类。
2.6.1 算术运算符
算术运算符用来完成基本的数值运算,如 加、减、乘、除,它们可用于所有的数据类型。如下表所示,列出了C语言所有的算术运算符。其中,“-”运算符即能表示两个操作数的减法运算,又能对一个操作数进行取反运算,将正数变为负数,或将负数变为正数。取模运算是取得两数相除的余数。
2.6.2 自增 和 自减
自增和自减体现了 C 语言语法的简洁,自增就是在原值的基础上加一,自减则是减一。它的使用格式是“变量++”或“++变量”,等同于“变量 = 变量 + 1”表达式。这两个运算符又称一目运算符,即参与运算的操作数只有一个。自增和自减操作符与变量间的位置不同也会有不同的运算效果,如下例所示:
int a = 5; // 声明整型变量并赋值
printf("a = %d\n", a++); // 输出变量的值后,再使变量自增
printf("a = %d\n" , ++a); // 变量自增后,再输出变量的值
代码中第 2 行输出的值为 5,因为先输出了变量的值,然后才使变量的值加 1。而运行到第 3 行时,输出的值为 7,变量在被输出前,已执行了自增运算。
运算符执行的顺序不同,代表着运算符有着不同的优先级。通常一目算术运算符的优先级最高,其次是基本的算术运算符,加、减、乘、除、取模,它们之间的优先级与算术运算相同,先乘、除、取模后加、减;优先级最低的是赋值运算。自增和自减运算与变量的位置决定着其优先级是最高还是最低。如下例所示:
int a = 5, b = 7, c = 20; // 声明整型变量并赋值
c = c + -a * b -c % b++; // 使用表达式为变量
这个例子的运算结果是 -21,代码第 2 行的表达式中最先运算的是 -a,为变量 a 取反,然后是从左向右结合的乘法运算和取模运算,再然后是从左向右结合的加、减法运算,接着是赋值运算,最后才是自增运算。
如果在表达式之中使用小括号,则会改变优先级,最里层括号内的表达式会被优先计算,但不包括一目运算符。代码如下:
int a = 5, b = 7, c = 20; // 声明整型变量并赋值
c = c + -a * ( ( b - c ) % b++ ); // 使用表达式为变量
这个例子的运算结果是 50,因为取反运算符和最里层括号内的表达式 b -c 最先被计算,然后再计算外层括号中的表达式,最后进行加法运算和赋值操作。
2.6.3 关系 和 逻辑 运算符
关系运算符用于比较两个数据间的差异,大于、小于 和 等于 是基本的关系运算符。逻辑运算符用于数值间的逻辑演算,与、或、非是基本的逻辑运算符。关系运算符和逻辑运算符关系密切,因此常划为一个类别。C语言中可用的关系和逻辑运算符如下表所示。
关系 和 逻辑 运算符 | |||
---|---|---|---|
运算符 | 说明 | 运算符 | 说明 |
> | 大于 | != | 不等于 |
< | 小于 | && | 与 |
<= | 大于或等于 | || | 或 |
>= | 小于或等于 | ! | 非 |
== | 等于 |
注意:或运算符 “||” 是通过两次按下键盘上的竖线输入的,即 “Shift + \”。另外,等于操作符 “==” 和赋值操作符 “=” 的意义完全不同。
关系 和 逻辑 运算符 用 “真” 和 “假” 表示运算结果。C语言中,非 0 的值在关系运算中都可以表示为 “真”, 0 表示为 “假”。它们有一套专门的计算方法,这套计算方法称之为逻辑运算,逻辑运算的结果用整型数据 1 表示 “真”,整型数据 0 表示 “假”。为了计算简便,下表推演出逻辑真值表:
逻辑真值表 | ||||
---|---|---|---|---|
p | q | p && q | p || q | !p |
0 | 0 | 0 | 0 | 1 |
0 | 非 0 | 0 | 1 | 1 |
非 0 | 非 0 | 1 | 1 | 0 |
非 0 | 0 | 0 | 1 | 0 |
该表是根据 p 和 q 的取值来计算逻辑表达式的值。关系 和 逻辑 运算符中,优先级最高的仍然是一目运算符 “!”,其次是关系运算符 “>=” 和 “<=”,再次是 “==” 和 “!=”,其后是 “&&”,最低是 “||”。同算术表达式一样,在关系或逻辑表达式中也可用括号来修改计算顺序。
2.6.4 位操作符
位操作是计算机底层的运算方式,与组成计算机的逻辑电路运行模式一致,C 语言支持全部的位操作符。因为 C语言的设计目的是取代汇编语言,所以它必须支持汇编语言所具有的运算能力。位操作是对字节或字中的位进行测试、置位或移位处理,这里字节或字是针对 C 标准中的字符型和整型数据类型而言的。位操作不能用于浮点型、空值或其他复杂类型。下表给出了位操作的操作符。
位操作符 | |||
---|---|---|---|
运算符 | 说明 | 运算符 | 说明 |
& | 按位与 | ~ | 1 的补码 |
| | 按位或 | >> | 右移 |
^ | 按位异或 | << | 左移 |
位操作中的与、或 和 1 的补码的真值表与逻辑运算等同,唯一不同的是位操作是逐位进行运算的,即比较操作数的每一个二进制位。如果两个操作数长度不一样,则将较短的操作数高位全部补 0。位操作增加了异或运算,下表是异或运算的逻辑真值表。
异或运算逻辑真值表 | |||||
---|---|---|---|---|---|
p | q | p ^ q | p | q | p ^ q |
0 | 0 | 0 | 1 | 1 | 0 |
0 | 1 | 1 | 1 | 0 | 1 |
2.6.5 问号操作符
问号操作符是最简单的条件语句,格式为:
条件表达式 ? 表达式 1 : 表达式 2;
问号操作符是 C 语言内唯一的三目运算符。其作用是在条件表达式为真的情况下,执行表达式 1,否则执行表达式 2。如下例所示:
int a = 5, b = 7; // 声明整型变量并赋值
a > b ? b++ : b--; // 当 a 大于 b 时,b 自增,否则 b 自减
显而易见,此例执行了一个表达式 b--。需要说明的是,问号操作符比一般的运算符优先级要低,仅次于后置的自增和自减。
2.6.6 逗号操作符
逗号操作符用于将多个表达式连接在一起。逗号操作符的左侧总是作为空值,如果要取得整个表达式的值,只有逗号表达式右侧的值是有效的。如下例所示:
int a = 5, b = 7; // 声明整型变量并赋值
b = ( a + b, a - b ); // 用表达式的结果为变量 b 赋值
代码第二行,b 的值变为 -2。因为第一个表达式 a + b 的计算结果作为空值被忽略,第二个表达式a - b 的计算结果被赋值给了 b。因为逗号操作符的优先级比赋值操作符优先级低,所以必须使用括号。
2.6.7 优先级
下表列出了 C 语言所有操作符的优先级,其中包括将后面要讨论的某些操作符。除一元操作符和问号操作符之外,所有操作符都是左结合的。一元操作符及问号操作符则为右结合。
C语言操作符的优先级 | |
---|---|
优先级最高 ↓ 优先级最低 |
() [] -> |
! ~ ++ -- -(type) * & sizeof | |
* / % | |
+ - | |
<< >> | |
<= >= | |
== != | |
& | |
^ | |
| | |
&& | |
|| | |
? | |
= += -= *= /= | |
, |
【C语言入门教程】2.6 运算符的更多相关文章
- 《JavaScript语言入门教程》记录整理:运算符、语法和标准库
目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
- 《JavaScript语言入门教程》记录整理:入门和数据类型
目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...
- 《JavaScript语言入门教程》记录整理:面向对象
目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...
- C语言入门教程-(5)格式化输入输出
1.输入和输出 在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出.在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出. 2.格式化输出— ...
- Go语言入门教程(十)之函数
Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...
- c语言该怎么入门?C语言入门教程(非常详细)
C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言.C语言是计算机产业的核心语言,操作系统.硬件驱动.关键组件.数据库等都离不开C语言:不学习C语言,就不能了解计算机底层. 这套「C语 ...
- Go 语言入门教程,共32讲,6小时(已完结)
Go语言入门教程,共32讲,6小时(完结) 在B站:https://www.bilibili.com/video/BV1fD4y1m7TD/
- c语言入门教程 / c语言入门经典书籍
用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...
- 【转】c语言入门教程 / c语言入门经典书籍
用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...
随机推荐
- Spring Cache 介绍
Spring Cache 缓存是实际工作中非常常用的一种提高性能的方法, 我们会在许多场景下来使用缓存. 本文通过一个简单的例子进行展开,通过对比我们原来的自定义缓存和 spring 的基于注释的 c ...
- CSS,font-family,好看常用的中文字体
例1(小米米官网):font-family: "Arial","Microsoft YaHei","黑体","宋体",s ...
- Javascript面向对象编程
https://segmentfault.com/a/1190000002900676 介绍 和java这种基于类(class-base)的面向对象的编程语言不同,javascript没有类这样的概念 ...
- json转换成对象
在json转换成对象时,json的key会与java 类的字段一一对应.如果没有映射上的java字段会在该数据类型上填充默认值,如int 0,String null 等. 没有映射的json key在 ...
- PHP中静态与抽象的概念
静态//普通成员//普通成员是属于对象的 //静态成员//静态成员属于类的 类中的静态属性非常类似于函数的全局变量.类中的静态成员是不需要对象而使用类名来直接访问的. //关键字:static//se ...
- win7下如何建立ftp服务器
前段时间正在做一个项目,需要上传东西到ftp服务器,纠结于如何建立ftp服务器.经过一番摸索.终于成功建立ftp服务器.现将我的经验跟大家分享一下.不足之处还望多多指点! 步骤/方法 首先在本地机器上 ...
- linux安装pip
1.先说一下什么是pippip 是"A tool for installing and managing Python packages.",也就是说pip是python的软件安装 ...
- javaWeb加载Properties文件
public static Properties loadProps(String fileName) { Properties props = null; InputStream is = null ...
- ios 消息转发初探
有时候服务器的接口文档上一个数据写的是string类型,这时候你就会直接把它赋值给一个label. 问题来了,有时候这个string的确是string,没有问题,有时候又是NSNumber,当然不管三 ...
- git之https或http方式设置记住用户名和密码的方法
https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速 设置记住密码(默认15分钟): git config --global credenti ...