1、if 语句
//if语句的三种语法: if(expression) //只有一条语句的if语句 sentence; if(expression) //if...else...语句 sentence 1; else sentence 2; if(expression 1) //if...else if...语句 sentence 1; else if (expression 2) sentence 2; ...... else if(expression m) sentence m; else sentence n; 当表达式结果为真则语句执行,表达式为假则语句不执行(其中0为假,非0为真)
判断是否为奇数?
#include <stdio.h> int main() { int num = 0; scanf_s("%d", &num); if (num % 2 == 1) printf("%d是奇数\n", num); printf("你猜对啦\n"); return 0; }
这时就会发现不管输入的数字是多少“你答对啦”总是会出现,这是因为默认情况下if语句和else语句都只能控制一个语句,可以通过添加{}来解决if和else后多语句问题,具体代码如下
#include <stdio.h> int main() { int num = 0; scanf_s("%d", &num); if (num % 2 == 1) { printf("%d是奇数\n", num); printf("你猜对啦\n"); } return 0; }
同样的对于else来说也可以在其后增加{}来达到同样的效果
#include <stdio.h> int main() { int num = 0; scanf_s("%d", &num); if (num % 2 == 1) { printf("%d是奇数\n", num); printf("你猜对啦\n"); } else { printf("你猜错啦\n"); } return 0; }
练判断输入数字是0,还是正数或负数?
#include <stdio.h> int main() { int num = 0; scanf_s("%d", &num); if (num == 0) { printf("输入的数字是0\n"); } else if (num > 0) { printf("输入的数字是正数"); } else { printf("输入的数字是负数"); } return 0; }
悬空else问题
//当if个数大于else个数时就会出现悬空else问题,具体情况如下: //代码运行结果为空 #include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) if(b == 2) printf("hehe\n"); else printf("haha\n"); return 0; }
结果显示为空,这是因为else默认与最近的if匹配
实际情况下的代码应该是这样的:
//代码运行结果为空 #include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) //a != 1,表达式结果为假内部if...else...语句不执行 { if(b == 2) printf("hehe\n"); else printf("haha\n"); } return 0; }
若想要else与第一个if匹配只需要这样改:
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) { if(b == 2) printf("hehe\n"); } else { printf("haha\n"); } return 0; }
综上所述,if语句中对于{}的运用是十分重要的,可以增强代码的可读性以及减少问题的发生。
2、关系操作符
C语言中运用比较的表达式,称为"关系表达式",里面使用的运算符就称为"关系运算符",主要有下面6个。
> 大于运算符
< 小于运算符
>= 大于等于运算符
<= 小于等于运算符
== 相等运算符
!= 不等运算符
注意!!! 相等运算符==与=是两个不一样的运算符,前者表示判断而后者表示赋值
可以通过将变量写在等号右边的位置来避免自己出错的可能
if(3 == a) ...
同时:多个关系运算方法不可以连用。
a < b < c
应该采用这样的写法:
a < b && b < c
3、逻辑操作符
!:逻辑取反运算符
const flag //定义变量flag if(!flag) //当flag为假时执行语句printf("hehe\n") { printf("hehe\n"); }
&& :与运算符,同真则真
|| :或运算符,同假则假
判断是否是闰年?
//方法一 #include <stdio.h> int main() { int year = 0; scanf_s("%d",&year); if(year %4 == 0 && year % 100 != 0) printf("是闰年\n"); else if(year % 400 == 0) printf("是闰年\n"); return 0; } //方法二 #include <stdio.h> int main() { int year = 0; scanf_s("%d",&year); if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) prinft("是闰年\n"); return 0; }
短路求值
仅根据左操作数的结果就能知道整个表达式的结果,不再对右表达式进行计算的运算称之为短路求值,具体解释如下:因为逻辑运算符的运算顺序是从左到右,对于&&而言如果左侧表达式值为假,那么就不需要运算右侧表达式,整个表达式结果为假;对于||如果左侧表达式值为真,那么就不需要运算右侧表示式,整个表达式结果为真。
4、switch语句
除了if语句之外,C语言还提供了switch语句来实现分支结构。相比于多重的if...else if语句,它有更易用、可读性更好的优势。具体格式如下:
switch(expression) //expression必须式整型表达式 { case value1: //value的值必须为整型常量表达式 statement; break; case value2: //case和value之间必须有空格,且value之后为冒号:而非; statement; break; //通过在case语句末尾加上break来实现跳出switch循环的目的 default: //当为找到可以匹配的case时,就会执行default语句,一般情况下default位于 statement; //switch语句末尾 break; }
switch语句中break的运用:
break语句在switch语句中时十分重要的,能帮助switch实现真正的分支效果,当然break也不是每个case语句都得有,需要根据实际情况判断。下面通过两个练习来更好的根据实际情况判断break的使用时机。
输入1~7的数字,打印对应的星期几。
具体代码如下:
#include <stdio.h> int main() { int day = 0; scanf("%d",&day); switch(day) { case 1: printf("周一\n"); break; case 2: printf("周二\n"); break; case 3: printf("周三\n"); break; case 4: printf("周四\n"); break; case 5: printf("周五\n"); break; case 6: printf("周六\n"); break; case 7: printf("周日\n"); break; default: printf("不存在\n"); break; } return 0; }
输入1~5,输出"工作日";输入6~7,输出"休息日"
#include <stdio.h> int main() { int day = 0; scanf("%d",&day); switch(day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; } return 0; }
5、while循环
C语言提供了3种循环语句,while循环就是其中一种。
while(expression) //判断表达式expression为真时进行循环否则跳出循环 { 语句; }
while循环中的continue和break:
//break的运用 #include <stdio.h> int main() { int i = 1; while (i <= 10) { if (i == 5) { break; //当i == 5 时循环全部结束,这时候输出结果为1 2 3 4 } printf("%d\n", i); i++; } return 0; } //continue的运用 #include <stdio.h> int main() { int i = 1; while (i <= 10) { if (i == 5) { continue; //当i == 5时重新返回while(expression)处进行判断 } // 因为当i == 5时跳过了i++,所以i一直为5,死循环 printf("%d\n", i); i++; } return 0; }
6、for循环
for(初始化;判断;调整) { 语句 }
计算1~100之间3的倍数的数字之和
#include <stdio.h> int main() { int i = 0; int sum = 0; int count =0; for (i = 1; i <= 100; i++) { if (i % 3 == 0) { sum += i; count++; } } printf("%d\n", sum); //得到结果 printf("总共有:%d个\n", count); //判断一共有多少个满足条件的数 return 0; } //更简单的写法 #include <stdio.h> int main() { int i = 0; int sum = 0; int count =0; for(i = 3;i <= 100 ;i+=3) { sum += i; count++; } printf("%d\n",sum); printf("总共有:%d个\n",count); return 0; }
for循环中的continue和break:
//break的运用 #include <stdio.h> int main() { int i = 1; for(i = 1;i<=10;i++) { if(i == 5) break; //和while的break一样都是结束整个循环 printf("%d",i); } return 0; } //结果为1 2 3 4 //continue的运用 #include <stdio.h> int main() { int i = 1; for(i = 1;i<=10;i++) { if(i == 5) continue; //相比于while中的continue直接跳到while(expression)处进行 printf("%d",i); //判断,for循环中的continue是跳转到循环的调整部分即i++处 } return 0; } //结果为1 2 3 4 6 7 8 9 10
注意!!! 在进行多个for循环嵌套时,break只会结束当前for循环并不会结束上一级循环,即如果第一个for循环没有写break,第二个写break,则break之后跳转至第二个for循环处且调整部分的值仍会进行++或--等。
7、do-while循环
不同于while循环先判断再执行语句的形式,do-while循环时按照先执行后判断的形式进行的,一班do-while循环使用在循环体至少执行一次的场景下,所以较少一些。
do { 语句; }while(expression); //这里的while需要加;
输入一个正整数,计算这个正数是几位数?
#include <stdio.h> int main() { int n = 0; scanf("%d",&n); int cut = 0; do { cnt++; n=n/10; }while(n); printf("%d\n",cnt); return 0; }
do-while循环中的break和continue:
do-while循环中的continue与break和while循环的作用几乎一模一样。
//break的运用 #include <stdio.h> int main() { int i = 1; do { if(i == 5) break; printf("%d",i); i++; }while(i<=10); return 0; } //continue的运用 #include <stdio.h> int main() { int i = 1; do { if(i == 5) countinue; printf("%d",i); i++; }while(i<=10); return 0; }
8、循环的嵌套
已经学习过了while循环、for循环、do while循环,而这三种循环往往只有嵌套在一起才能更好的解决问题,我们称之为循环嵌套。
找出100~200之间的素数,并打印。
注:素数又称质数,只能被1和其本身整除的数字。
#include <stdio.h> int main() { int i = 0; for(i = 100;i<=200;i++) //循环产生100~200的数字 { int j = 0; //初始化j,使得每次大循环结束后j的值都会被初始化 int flag = 1; //每次在内置for循环结束后flag就会被初始化为1,即开始时假设i为素数 for(j = 2;j<i;j++) //循环产生2~i-1之间的数字 { if(i%j == 0) //判断i是否是能被j整除 { flag = 0; //i不能被j整除时flag的值被赋值为0,同时break跳出内置for循环(含j) break; } } if(flag == 1) //如果没有任何j可以整除i那么最开始的flag的值仍等于1不会被重 //新赋值,如果有j可以整除i那么在内置for循环中flag被重新赋值为0 //不满足if(flag == 1) 不会打印i,最后进行i++开始新一轮大循环 { printf("%d",i); } } return 0; }
9、goto语句
C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一函数内跳转到设置好的标号处。比如:
#include <stdio.h> int main() { printf("hehe\n"); goto next: printf("haha\n"); next: printf("跳过了haha的打印\n"); return 0; } //结果为: //hehe //跳过了haha的打印
goto语句如果使用不当,就会导致在函数内部随意乱跳,所以一般不建议使用,但是当想要从多层循环中快速跳出的话,goto语句会显得很方便。
for(...) { for(...) { for(...) { if(disaster) //例子中的意思时当运行结果有问题时跳出循环到外面的error goto error; } } } error: //.....
相比于使用多个break时在循环中一层一层的跳出,直接使用goto语句显得很方便。
~over~