# 2.C语言逻辑运算符和表达式
C语言中提供了三种逻辑运算符:
1. &&(与运算)
2. ||(或运算)
3. !(非运算)
与运算符(&&)和或运算符(||)均为双目运算符。具有左结合性。非运算符(!)为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:
![](http://www.lvtao.net/content/uploadfile/201404/c03c63c84e95bd462357c1e09b21c93b20140421035048.gif)
“&&”和“||”低于关系运算符,“!”高于算术运算符。
按照运算符的优先顺序可以得出:
* a>b && c>d 等价于 (a>b)&&(c>d)
* !b==c||d<a 等价于 ((!b)==c)||(d<a)
* a+b>c&&x+yc)&&((x+y)<b)
## 逻辑运算的值
逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:
1) 与运算(&&)
参与运算的两个量都为真时,结果才为真,否则为假。例如:
5>0 && 4>2
由于5>0为真,4>2也为真,相与的结果也为真。
2) 或运算(||)
参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:
5>0||5>8
由于5>0为真,相或的结果也就为真。
3) 非运算(!)
参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:
!(5>0)
的结果为假。
虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:
由于5和3均为非“0”因此5&&3的值为“真”,即为1。
又如:
5||0的值为“真”,即为1。
## 逻辑表达式
逻辑表达式的一般形式为:
表达式 逻辑运算符 表达式
其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:
(a&&b)&&c
根据逻辑运算符的左结合性,上式也可写为:
a&&b&&c
逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。
【例5-2】
~~~
main(){
char c='k';
int i=1,j=2,k=3;
float x=3e+5,y=0.85;
printf( "%d,%d\n", !x*!y, !!!x );
printf( "%d,%d\n", x||i&&j-3, i<j&&x<y );
printf( "%d,%d\n", i==5&&c&&(j=8), x+y||i+j+k );
}
~~~
本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x|| i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故x||i&&j-3的逻辑值为 1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y||i+j+k由于x+y的值为非0,故整个或表达式的值为1。
- 前言
- 一. C语言概述
- 1.C语言的发展及其版本
- 2.C语言工作原理和运行机制
- 3.C语言编译器(开发工具|IDE)推荐
- 4.C语言的特点
- 5.第一个C语言程序
- 6.C语言输出函数(printf)和输入函数(scanf)
- 7.C语言程序的结构特点
- 8.C语言字符集
- 9.C语言词汇
- 二. C语言算法
- 1.什么是算法|算法的概念
- 2.简单的C语言算法举例
- 3.C语言算法的特性
- 4.用流程图表示算法
- 5.三种基本结构的流程图
- 6.用N-S流程图表示算法
- 7.用计算机语言表示算法
- 三. 数据类型和运算符
- 1.C语言的数据类型
- 2.C语言常量与变量
- 3.C语言整型数据
- 4.C语言实型数据
- 5.C语言字符型数据
- 6.C语言变量赋初值
- 7.C语言数据类型转换
- 8.C语言算术运算符和算术表达式
- 9.C语言赋值运算符和赋值表达式
- 10.C语言逗号运算符和逗号表达式
- 四. 顺序程序设计
- 1.C语言语句概述
- 2.C语言赋值语句详解
- 3.C语言数据的输入输出
- 4.C语言字符的输入输出
- 7.C语言顺序结构程序设计举例
- 五. 分支结构
- 1.C语言关系运算符和表达式
- 2.C语言逻辑运算符和表达式
- 3.C语言if语句详解
- 4.C语言switch语句的用法详解
- 5.C语言条件运算符和条件表达式
- 6.C语言分支结构程序举例
- 六. 循环控制
- 1.C语言循环控制概述
- 2.C语言goto语句以及用goto语句构成循环
- 3.C语言while语句的用法
- 4.C语言do-while语句的用法
- 5.C语言for语句用法详解
- 6.C语言几种循环的比较
- 7.C语言break和continue语句的用法
- 8.C语言循环控制程序举例
- 七. C语言数组
- 1.C语言一维数组的定义和引用
- 2.C语言二维数组的定义和引用
- 3.C语言字符数组及其应用
- 4.C语言常用字符串处理函数
- 5.C语言数组应用举例
- 6.C语言数组小结
- 八. C语言函数
- 1.C语言函数概述
- 2.C语言函数的定义
- 3.C语言函数的参数和返回值
- 4.C语言函数的调用
- 5.C语言函数的嵌套调用
- 6.C语言函数的递归调用
- 7.C语言数组作为函数参数
- 8.C语言局部变量和全局变量
- 9.C语言变量的存储类别
- 九. 预处理命令
- 1.C语言预处理概述
- 2.C语言无参数宏定义
- 3.C语言带参数宏定义
- 4.C语言文件包含命令
- 5.C语言条件编译详解
- 6.C语言预处理指令总结
- 十. C语言指针
- 1.C语言指针的概念
- 2.C语言指针变量
- 3.C语言指针变量作为函数参数
- 4.C语言指针变量的运算
- 5.C语言数组指针
- 6.C语言通过指针引用数组
- 7.C语言数组名作函数参数
- 8.C语言指向多维数组的指针
- 9.C语言字符串指针
- 10.C语言字符串指针变量与字符数组的区别
- 11.C语言函数指针变量
- 12.C语言指针型函数
- 13.C语言指针数组的概念
- 14.C语言指向指针的指针
- 15.C语言main函数参数
- 16.关于指针的总结
- 十一. 结构体和共用体
- 1.C语言结构体的定义
- 2.C语言结构类型变量的说明
- 3.C语言结构变量成员的表示方法
- 4.C语言结构变量的赋值
- 5.C语言结构变量的初始化
- 6.C语言结构体数组的定义
- 7.C语言指向结构体变量的指针
- 8.C语言指向结构体数组的指针
- 9.C语言结构体指针变量作函数参数
- 10.C语言动态存储分配
- 11.C语言链表的概念
- 12.C语言枚举类型
- 13.C语言类型定义符typedef
- 十二. 位运算
- 1.C语言位运算符详解
- 2.C语言位域(位段)
- 3.关于位运算的总结
- 十三. 文件操作
- 1.C语言文件概述
- 2.C语言文件指针
- 3.C语言文件的打开与关闭
- 4.C语言文件的读写
- 5.C语言文件的随机读写
- 6.C语言文件检测函数
- 7.C语言库文件(头文件)有哪些
- 8.文件操作小结