0%

进一步的判断与循环

逻辑类型和运算


bool

  • 首先需要调用头文件:#include <stdbool.h>
  • 之后就可以使用bool和true、false
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdbool.h>

int main()
{
bool b = 6>5;
bool t = true;
t = 2;
printf("%d\n",b);

return 0;
}

运算结果: 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 =,+=,-=,*=,/=,%= 从右到左

替换成逻辑运算的式子

图怪兽_6513f7a0f8351e2581b856763d02a4b6_37623

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
2
3
4
if ( count > 20 )
count = count-10;
else
count = count+10;

复杂的情况下会带来很大麻烦

优先级

  • 条件运算符的优先级高于赋值运算符,但是低于其他运算符

image-20201009152504884

嵌套条件表达式

image-20201009152648569

我们在理解这个东西怎么计算,把所有分支部分算明白

然后再回到总的地方

所以最好不要使用嵌套的条件表达式,使得程序变得复杂,让别人来理解你的程序太困难

逗号运算

  • 逗号用来连接两个表达式,并以其右边的表达式的值作为它的结果。逗号的优先级是所有的运算符中最低的,所以它两边的表达式会先计算;都好的组合关系是自左向右,所以左边的表达式会先计算,二右边的表达式的值就留下来作为逗号运算的结果。

例如:

1
2
3
4
int i;
i = 3+4, 5+6;

pritnf("%d/n",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-- )

其中有三个表达式,想要在里面放多个计算时候,就可以使用逗号