.什么是语句?
c语句有五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
2+3;//表达式语句 Add();//函数调用语句 if(){};//控制语句 ;//空语句
可以简单理解为:一段别分号;隔开的代码就是一条语句。
c语言是一个结构化的程序设计语言。那么这里结构化包括三类结构:顺序结构,选择结构,循环结构。
下面我们来看控制语句:
大体可分为三类:
1.条件判断语句(分支语句):if语句、switch语句
2.循环语句:do…while语句、while语句、for语句
3.转向语句:break语句、continue语句、goto语句、return语句
2.分支语句
2.1 if语句
2.1.1 if语句语法结构
if(表达式) 语句; if(表达式) 语句1; else 语句2; //多分支 if(表达式1) 语句1; else if(表达式2) 语句2; else 语句3; //执行多条语句 int main() { if(表达式) { 语句列表1; } else { 语句列表2; } return 0; }//在书写时我们应该带上依据具体场景适当带上{}
这里需要解释到的就是表达式结果为真,语句执行。在c语言中,0为假,非0为真。
2.1.2 悬空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) { if (b == 2) printf("hehe\n"); else printf("haha\n"); } return 0; }
这样我们就可以很好的去理解这段代码的逻辑。
2.1.3 if书写形式优化
这里书写形式我们来谈一谈,想要成为一个好的程序员我们必须要把代码写的像诗一样有条理,有内容,有高光。感兴趣的可以看看小米CEO雷军,网评说是写代码像诗一样优雅! 我respect!
先来了解一下if书写形式,后面我们再来了解更多的排版格式问题。
2.1.3.1推荐第一种形式
//代码1 if (condition) { return x; } return y; //代码2 if(condition) { return x; } else { return y; }//建议使用代码2形式
这段内容怎么去理解呢?咱们还使用实例来谈谈。
#include <stdio.h> //优化前 int test() { if (0) return 1; return 0; } //优化后 int test() { if(0) { return 1; } else { return 0; } } int main() { int a = test(); return 0; }
这段代码就能很好的反映出上述结构中的问题。显然优化后的代码结构更加显眼,一眼就能看出执行流程,理解上来更加容易。
2.1.3.2推荐第二种形式
//代码1 int num = 1; if(num == 5) { printf("hehe\n"); } //代码2 int num = 1; if(5 == num) { printf("hehe\n"); }
看上去不就是常量5和变量num换了个位置吗?有什么区别呢?下面我们来看看如果判断==变成赋值=的报错情况就知道了。
这种情况下,就出现了一个bug,而且我们初学者很不容易发现。怎么去解决呢?
把常量放在判断符号前,变量放在判断符号后,这样就可以很好的解决这个bug再次出现。(这种方法只适合用在变量上,表达式不必使用即可)。
2.1.4 相关练习
2.1.4.1 判断一个数是否为奇数
#include <stdio.h> int main() { int number = 0; scanf("%d",&number); if(number%2 == 1) { printf("%d是奇数\n",number); } else { printf("%d是偶数\n",number); } return 0; }
2.1.4.2 输出1-100之间的奇数
#include <stdio.h> int main() { int i = 0; for (i = 0; i <= 100; i++) { if (i % 2 == 1) { printf("%d是奇数\n", i); } } return 0; }
2.2 switch语句
2.2.1 switch语句结构
switch(整型表达式) { 语句项; }
那么语句项是什么呢?
//是一些case语句: //如下: case 整形常量表达式: 语句;
注意一个细节,那就是switch语句表达式必须是整型表达式,case后的表达式也必须是整型常量表达式。
举例子说明:
这就很明显的强调了表达式。
2.2.2 在switch中的break
还是通过实例来看:
#include <stdio.h> int main() { int day = 0; 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; } return 0; }
这里的break的作用就是将case语句独立起来,如果没有break语句,那么我们想要的不是独立结果,switch语句中执行case语句时,是依次向下。break语句进行的分支操作。
有时候需求不同,我们还会把内容进行增删操作,如:
#include <stdio.h> //switch代码演示 //1. 输入1-5,输出的是“weekday” //2. 输入6-7,输出“weekend” int main() { int day = 0; switch(day) { case 1: case 2: case 3: case 4: case 5: printf("weekday\n"); break; case 6: case 7: printf("weekend\n"); break; } return 0; }
另外多句嘴:
在最后一个case语句的后面加上一条break语句。
2.2.3 default子句
当我们例举的case条件中没有我们的需求,就要用到default语句对其填充说明。
养成好习惯:在每个switch语句中放一条default子句是个好习惯,甚至可以在后面再加一个break,都是可以的。
2.2.4 练习
看下面代码我们回答打印出多少?
#include <stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++; case 2: n++; case 3: switch (n) {//switch允许嵌套使用 case 1: n++; case 2: m++; n++; break; } case 4: m++; break; default: break; } printf("m = %d, n = %d\n", m, n); return 0; }
最终结果是:m=5,n=3
我们一来分析一下:
3.循环语句
3.1 while循环语句
3.1.1 while循环语句语法结构和执行流程
while(表达式) 循环语句;
执行流程: