逻辑类型和运算
bool
- 首先需要调用头文件:
#include <stdbool.h>
- 之后就可以使用bool和true、false
1 |
|
运算结果: 1
这个程序没有真正bool 量类型
没有特别的方式去输出bool量,只能得到1,不会是true
无法让printf 去判断 true 和 false 值
逻辑运算
- 逻辑运算是对逻辑量进行的运算,结果只有 0 或 1
- 逻辑量是关系运算或逻辑运算的结果
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
! | 逻辑非 | !a | 如果a是true结果就是false,如果a是false结果就是true |
&& | 逻辑与 | a && b | 如果a和b都是true,结果就是true;否则就是false |
|| | 逻辑或 | a || b | 如果a和b有一个是true,结果为true;两个都是false,结果为false |
示例
- 如果要表达数学中的区间,如:
x ∈(4,6)
或x ∈ [4,6]
,应该如何写C的表达式?
错误:
4 < x < 6
像 4 < x < 6
这样的式子,不是C能正确计算的式子,只是能编译的式子,但意思不一样
是 4 先判断 是不是 < x ,得到的结果 0 或者 1
再看 0 或者 1 是否 < 6 ,既然结果只有 0 或者 1
无论 0 或者 1 都是 < 6 的
所以这个式子的结果怎么都是1
不可能去判断 x 是不是在 4 和 6 之间
因为 4 < x 的结果是一个逻辑值 (0或1)
正确:x > 4 && x < 6
- 如何判断一个字符c是否是大写字母?
c >= ‘ A ‘ && c <= ‘ Z ‘
理解示例:
age > 20 && age < 30
age 处于20 到 30 中间 ,并且两头都不包含
index < 0 || index > 99
index 不在 0 – 99的范围内,小于0或者大于99
! age < 20
这两面有两个运算符,虽然逻辑运算符要低于比较运算符,但可是! 是单目运算符,还有另一条规则,单目运算符要高于双目运算符。
表面上看,是age < 20 的反面那就是,age >= 20 ,
但 ! 会先做和age结合在一起,如果age 是0 ,那么!age就会变成1,如果age 不是0,!age会变成0,再去和20 作比较,因为这个的结果不是0就是1,和<20去做比较话,那整个表达式永远都会是1
如果要做到age不是 < 20 ,给 age 加括号 ()
优先级
三个运算符优先级是各不相同
! > && > ||
!done && (count > MAX)
! 优先级最高,会先算
& 后面有括号,其实可以不必要有,如果 count > MAX
并且 done
是 0 ,整个结果才会是 1
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () | 从左到右 |
2 | !,+ ,- ,++ ,– | 从右到左(单目的+和 - ) |
3 | *,/,% | 从左到右 |
4 | + ,- | 从左到右 |
5 | < ,<=, > ,>= | 从左到右 |
6 | ==,!= | 从左到右 |
7 | && | 从左到右 |
8 | || | 从左到右 |
9 | =,+=,-=,*=,/=,%= | 从右到左 |
替换成逻辑运算的式子
1 | (i! = j && i!=k && j!=k) |
单目运算符
单目运算是指运算符包括赋值运算符、算术运算符、逻辑运算符、位逻辑运算符、位移运算符、关系运算符、自增自减运算符。
单目操作符 也就是只接受一个操作数的操作符
包括 ! ,++,sizeof ,~,–,(type)
在运算优先级里位第二位。
双目运算符
运算所需变量为两个的运算符叫做双目运算符,或者要求运算对象的个数是2的运算符称为双目运算符。
点击查看详细双目运算符
短路
逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
- a == 6 && b==1
- a == 6 && b+=1
如果 a==6 不成立b==1 就不会去算了
如果要是右边进行了赋值,需要产生一些结果,所以
- 对于&&,左边是false时就不做右边了
- 对于||,左边是true 时就不做右边了
这称为短路
所以不要把:不要把赋值,包括复合赋值组合进表达式!
条件运算符
- count = (count > 20) ? count -10 : count + 10;
- 条件、条件满足时的值和条件不满足时的值
如:
1 | if ( count > 20 ) |
复杂的情况下会带来很大麻烦
优先级
- 条件运算符的优先级高于赋值运算符,但是低于其他运算符
嵌套条件表达式
我们在理解这个东西怎么计算,把所有分支部分算明白
然后再回到总的地方
所以最好不要使用嵌套的条件表达式,使得程序变得复杂,让别人来理解你的程序太困难
逗号运算
- 逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果。逗号的优先级是所有的运算符中最低的,所以它两边的表达式会先计算;都好的组合关系是自左向右,所以左边的表达式会先计算,二右边的表达式的值就留下来作为逗号运算的结果。
例如:
1 | int i; |
运行结果,会提示没有用到 5+6
因为 3+4 被赋值给了 i ,i= 3+4
这是一个表达式
赋值优先级比 , 要来的高,所以 i= 3+4
会先算
然后再去算5+6 ,但是没有交给任何人,表达式的结果没有用到。
如果:
i =( 3+4, 5+6 );
加了一个括号提升了优先级,但会提示 3+4 没有用到
最后运行结果 11
表示是 逗号后的运算结果,去赋值给了 i
逗号的作用,主要是在for中使用
for ( i=0, j=10; i<j ;i++, j-- )
其中有三个表达式,想要在里面放多个计算时候,就可以使用逗号