4.1逻辑类型和运算
bool
#include<stdbool.h>
之后就可以使用bool和true、false
逻辑运算
逻辑运算是对逻辑量进行的运算,结果只有0或1
逻辑量是关系运算或逻辑运算的结果
! 非 取反运算
&& 并且
|| 或者
如何判断一个字符c是否是大写字母?
c>=‘A’&&c<=‘Z’
!age<20
永远成立
优先级
!>&&>||
!done&&(count>MAX)
短路
逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
a==6&&b+=1
对于&&,左边是false是就不做右边了
对于||,左边是true时就不做右边了
不要不赋值,包括符合赋值组合进表达式!
条件运算符
count=(count>20)?count-10:count+10;
条件?条件满足时的值:条件不满足时的值
if(count>20)
count=count-10;
else
count=count+10;
表面看起来简单了很多,实际可能带来很多麻烦
优先级
条件运算符的优先级高于赋值运算符,但是低于其他运算符
m>n?x:a+5
条件运算符是自右向左结合的
使用嵌套的条件表达式不好
逗号运算
逗号用来连接两个表达式,并且以右边的表达式作为它的结果。逗号的优先级是所有运算符中最低的,所以它两边的表达式会先计算;逗号的组合关系是自左向右,所以左边的表达式会先计算,而右边的表达式的值就留下来作为逗号运算的结果。
在for中使用
for(i=0,j=10;i<j;i++,j–)
比较三个数大小
int a,b,c;
scanf("%d %d",&a,&b,&c);
int max=0;
if(a>b){
if(a>c){
max=a;
}else{
max=c;
}
}else{
if(b>c){
max=b;
}else{
max=c;
}
}
printf("The max is %d\n",max);
嵌套的判断
当if的条件满足的时候或者不满足的时候要执行的语句也可以是一条fi或if-else语句,这就是嵌套的if语句
else的匹配
没被{}隔开时,else总是和最近的那个if匹配
tips
在if或else后面总是yong{}
即使只有一条语句的时候
分段函数
if (x<0){
f=-1;
}else if(x==0){
f=0;
}else{
f=2*x;
}
printf("%d",f)
//单一出口,相比每一个判断都输出printf,更灵活
级联的if-else if
去掉{} 使else对齐
switch-case
switch(type){
case 1:
printf("你好");
break;
case 2:
printf("早上好");
break;
case 3:
printf("晚上好");
break;
case 4:
printf("再见");
break;
default:
printf("啊,什么啊?");
break;
}
switch(控制表达式){
case 1:
语句
——
default:
语句
——
}
控制表达式只能是整数型的结果
常量可以是常数,也可以是常数计算的表达式
break
switch语句可以看做是一种基于计算的跳转,计算控制表达式的值后,程序会跳转到相匹配的case(分支标号)处。分支标号只是说明switch内部位置的路标,在执行完分支中的最后一条语句后,如果后面没有break,就会顺序执行到下面的case里去,直到遇到一个break,或者switch结束为止。
case入口路牌 break才能出去
log2小套路
int x;
int ret=0;
scanf("%d",&x);
int t=x;
while(x>1){
x/=2;
ret++;
}
printf("log2 of %d is %d.",t,ret);
计算之前保存原始值,后面可能用到
计数循环小套路
如果要模拟运行一个很大次数的循环,可以模拟较少的循环次数,然后做出推断。
算平均数
int number;
int sum=0;
int count=0;
scanf("%d",&number);
while(number!=-1){
sum+=number;
count++;
scanf("%d",&number);
}
printf("%f\n",1.0*sum/count);
猜数游戏
#include<stdlib.h>
#include<time.h>
srand(time(0));
int number=rand()%100+1;
int count=0;
int a=0;
printf("我已经想好了一个1到100之间的数。");
do{
printf("请猜这个1到100之间的数。:");
scanf("%d",&a);
count++;
if(a>number){
printf("你猜的岁数大了。");
}else if(a<number){
printf("你猜的数小了。");
}
}while(a!=number);
printf("太好了,你用了%d次就猜到了答案\n",count);
随机数
每次召唤rand()就得到一个随机的整数
整数的分解
int x;
scanf("%d",&x);
int digit;
int ret=0;
while(x>0){
digit=x%10;
printf("%d,",digit);
ret=ret*10+degit;
printf("x=%d,digit=%d,ret=%D\n",x,digit,ret);
x/=10;
}
printf("%d",ret);
if语句常见的错误
忘了大括号
if后面的分号
错误使用==和=
使人困惑的else
代码风格
在if和else之后必须加上大括号形成语句块;
大括号内的语句缩进一个tab的位置;
风格是三观