运算符是程序中用于数值运算的操作符,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 运算符的更多相关文章

  1. 《JavaScript语言入门教程》记录整理:运算符、语法和标准库

    目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...

  2. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  3. 《JavaScript语言入门教程》记录整理:入门和数据类型

    目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...

  4. 《JavaScript语言入门教程》记录整理:面向对象

    目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...

  5. C语言入门教程-(5)格式化输入输出

    1.输入和输出 在程序的使用中,我们经常可以看的这么一个场景:用户需要输入数据,经过程序运算,得到结果后输出.在C语言中,输入数据和输出数据都是由库函数完成的,通过语句来输入/输出. 2.格式化输出— ...

  6. Go语言入门教程(十)之函数

    Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...

  7. c语言该怎么入门?C语言入门教程(非常详细)

    C语言是一门面向过程的编译型语言,它的运行速度极快,仅次于汇编语言.C语言是计算机产业的核心语言,操作系统.硬件驱动.关键组件.数据库等都离不开C语言:不学习C语言,就不能了解计算机底层. 这套「C语 ...

  8. Go 语言入门教程,共32讲,6小时(已完结)

    Go语言入门教程,共32讲,6小时(完结) 在B站:https://www.bilibili.com/video/BV1fD4y1m7TD/

  9. c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...

  10. 【转】c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...

随机推荐

  1. Centos下查看占用端口并关闭进程方法

    1.查看端口占用情况:netstat –tlnp   (加p可以看到是哪个进程占用了端口); 也可以用grep查找对应的被占用的端口,键入netstat –tlnp | grep 3306可以看到PI ...

  2. POJ 2236 Wireless Network(并查集)

    传送门  Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 24513   Accepted ...

  3. Unable to execute dex: java.nio.BufferOverflowException.解决办法

    异常提示: [2014-01-16 09:27:35 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. Ch ...

  4. 机器学习笔记—Logistic回归

    本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处.谢谢 序言:what is logistic regression? Logistics 一词表示adj.逻辑的;[军]后勤学的n.[逻] ...

  5. java编程思想-java注解

    注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据. 一.定义注解 注解的定义看起来很像接口的定义.事实上,与其他任何Java接口一样, ...

  6. elasticsearch scroll api--jestclient invoke

    @Test public void testScroll(){ JestClientFactory factory = new JestClientFactory(); factory.setHttp ...

  7. 自然语言9_NLTK计算中文高频词

    以下代码仅限于python2 NLTK计算中文高频词 >>> sinica_fd=nltk.FreqDist(sinica_treebank.words()) >>> ...

  8. 2016 年 Python 开发者调查结果

    1.在团队中工作 vs 独立工作 有趣的是,半数的受访者大部分时间在团队中工作,而另外半数的受访者则独立的做项目. 在公司中工作 vs 独立从事自己的项目 大约80%的受访者告诉我们,他们在公司里面工 ...

  9. shiro 更改登录的用户名

    ShiroUser user = (ShiroUser) SecurityUtils.getSubject().getPrincipal(); user.name = newName;

  10. 如何查看crontab的日志记录

    在Unix和类Unix的操作系统之中,crontab命令常用于设置周期性被执行的指令,也可以理解为设置定时任务. crontab中的定时任务有时候没有成功执行,什么原因呢?这时就需要去日志里去分析一下 ...