选择与判断语句
二选一,if()...else...
if()...else... ()中为条件判断,()中的结果为bool变量。所以一般用关系运算作为内容,关系运算的返回值是bool变量,比如>,<,>=,<=,==.!=等关系运算符。
逻辑运算符与&& 或|| 非!,用于bool变量之间的运算,结果仍然是bool变量。
注意:对于!,!0=1,!!0=0;那么!-2和!2都等于0;除0以外的所有数的逻辑判断都是1;
#include<stdio.h>
int main(){
int a=-20;
int b=20;
int c=0;
if(!a){
printf("对于非-20运算结果为true\n");
}
else{
printf("对于非-20运算结果为false\n");
}
if(!b){
printf("对于非20运算结果为true\n");
}
else{
printf("对于非20运算结果为false\n");
}
if(!c){
printf("对于非0运算结果为true\n");
}
else{
printf("对于非0运算结果为false\n");
}
return 0;
}
多选一,if()...else if()...else if()... else...
类似于if()...else...,对比与多个if语句,多个if语句每个if都会判断,不管是否满足条件,直到所有的if全部执行完。但是if else if 运行从第一个if开始,只要找到第一个满足条件的if,就不在执行之后的代码。
多选一,switch()...case...default:
类似于if...else if...else,不同之处是前者按顺序执行,直到找到符合条件的结果结束,后者并列执行,不执行与代码位置无关,可以直接找到符合条件的结果结束。
注意:每个case后需要配套break,如果不配套break,那么会顺序向下执行直到找到break才跳出switch case;若多个分支共享一种方法则可以写在一起。case xx:case yy: xxxxxx;
swtich()中()可以是字符(本质上是整数)和整型。
建议:对于多分支选择(分支可用整数代替)时,swtich case代码简洁,else if 代码量冗余可读性低。
对于多分支选择,但是分支是一个区间时,else if直接用关系运算符判断,更好用,switch case需要手动转换每一个段对应的几个整数。
循环语句
while()与do...while()
while循环,()中是循环条件,只要条件为真就执行代码,条件为假就不执行。一般需要一个控制次数的变量,该变量有三个表达式:初始值,临界值,和变化值。随着循环运行使变量值变化,直到变量值达到临界值,停止循环,避免死循环。
do...while类似,但是无论如何都会执行一次语句,因为do...while是先执行,再判断。而while是先判断,再执行。
for(表达式1;表达式2 ;表达式3 ;)
for循环,将while循环的控制变量的三个表达式,放在了()里面,所以for循环和带三个表达式的while循环无条件等价。for执行过程是先判断表达式2,再执行代码,表达式3永远最后执行(就算提前continue了)。而且for循环()中表达式可以省略,但是三个分号不能省。省去的表达式可以放在循环外面或者里面,只要能正常运行。如果省去了三个表达式但是外部没有添加,成为了for(;;;),那这就是个死循环。
C99标准允许在表达式1中定义初始值,但C89不支持。
tips:对于循环次数,当变量x初始值定为1,循环n次,则循环条件要取=,即x<=n,x++;当变量x初始值定为0,循环n次,则循环条件要取=,即x<n,x++;
结束语句
break和continue
break是直接结束循环,进入下面的其他代码,整个循环已经结束。而continue是结束这一次循环,结束之后又会进入循环,整个循环还在运行。
break一般写在循环体中,作为终止循环的一个条件,循环中可以有多个控制变量来控制循环的停止。
continue一般也写在循环体中,用来筛选掉一些不合目的的循环,最后循环执行完后,就都是想要的数据了。
作业案例:求两个数的最大公约数和最小公倍数和判断一个区间的水仙花数个数
#include<stdio.h>
int main(){
int m=0;int n=0;
printf("输入两个正数,求最大公约数和最小公倍数\n");
scanf("%d%d",&m,&n);
int i=1;
while(1){
if(i%m==0&&i%n==0){
printf("最小公倍数是%d\n",i);
break;
}
i++;
}
int min=0;
if(m>=n)min=n;
else min=m;
for(int j=min;j>=1;j--){
if(m%j==0&&n%j==0){
printf("最大公约数是%d\n\n",j);
break;
}
}
printf("==============================================\n==============================================\n\n");
printf("输入一个区间l,r,求出水仙花数\n");
int l=0;
int r=0;
while(1){
scanf("%d%d",&l,&r);
if(l>r||l<0||r<0){
puts("请输入正确的区间");
continue;
}
printf("该区间所有的水仙花数为\n");
break;
}
for(int i=l;i<=r;i++){
if(i<100)continue;
if(i>999)break;
int g=i%10;
int s=(i/10)%10;
int b=i/100;
if(g*g*g+s*s*s+b*b*b==i)printf("%d ",i);
}
return 0;
}
错误积累:error stray xxx in program //输入了中文字符比如中文分号;
error: x undeclared (first use in this function)//变量未定义,直接使用;