2.4.1.3:两段代码的对比
int main() { int a = 1; if (a) { return 1; } return 2; }
int main() { int a = 1; if (a) { return 1; } else { return 2; } }
上面这两段代码要表达的意思和执行的结果都是一样的,如果表达式a为真就返回1,否则就返回2。第一段代码很可能会误解人,所以我们一定要注意代码风格,让人容易理解。
2.1.4.4:表达式的书写细节
int main() { int num = 0; if (num == 10) { printf("hehe\n"); } return 0; }
此时我们希望当num等于10的时候程序可以输出“hehe”,显然这里num是0就不会输出“hehe”,这时如果当我们把if后面的表达式 num== 10不小心漏掉了一个等号,写成 num=10,此时代码的运行结果是怎样的呢?我们不妨上机试试。
此时程序不仅没有报错,还打印出了“hehe”,不符合我们的预期。出现这种情况的原因是:num = 10;是一条赋值语句,此时num被赋为10,非0为真,为真的话就会执行if后面的语句。那如何避免这种情况的出现呢?
我们可以把 num == 10; 写成 10 == num;这两条语句表达的意思和执行的结果都是一样的,都是判断num是否等于10.这样写当我们不小心少写一个=的时候,程序就会报错提醒我们。
比较一个变量和一个常量是否相等的时候,建议把常量放在等号的左边
2.1.5:练习
2.1.5.1:判断奇偶数
int main() { int num = 0; scanf("%d", &num); if (num % 2 == 1) { printf("是奇数\n"); } else { printf("是偶数\n"); } return 0; }
注意这里不需要把“num % 2 == 1”写成“1 == num%2”,因为这里的“num % 2”是一个表达式,如果我们把“num % 2 == 1”的等号漏掉了一个,代码是编译不过去的。
2.1.5.2:输出1~100之间的奇数
int main() { int i = 1; while (i <= 100) { if (i % 2 == 1) { printf("%d ", i); } i++; } return 0; }
还可以这样来写,下面没有用到if来进行判断,而是用到了算法,奇数之间相差2,最初我们让i=1,此后每次让i加2就可以把1~100的所有奇数打印出来。上面的代码会执行100次循环,而下面的代码只会执行50次循环并且没有判断,效率会大大提高。
int main() { int i = 1; while (i <= 100) { printf("%d ", i); i += 2; } return 0; }
2.2:switch语句
switch语句也是一种分支语句。常常用于多分支的情况。
比如:
- 输入1,输出星期一
- 输入2,输出星期二
- 输入3,输出星期三
- 输入4,输出星期四
- 输入5,输出星期五
- 输入6,输出星期六
- 输入7,输出星期日
此时如果我们写成if else语句的话就十分繁琐。这时我们就可以用上switch语句,代码如下:如果day是3,就执行case 3:下面的printf,然后通过break跳出这个switch。如果day是5,就执行case 5:下面的printf,然后通过break跳出这个switch。
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; } return 0; }
2.2.1:注意break关键字的使用
需要注意的是,这里的case仅仅是选择分支的入口,比如当day等于3的时候,程序会从case 3: 这个入口进去,执行后面的语句,break就是出口,当执行到break的时候,程序会跳出switch,如果没有这个switch会发生什么结果呢?让我们来试试:
可见,去掉break后,我们再输入3,程序把星期三~星期天都打印出来了。原因就是这里没有break,当输入3后,程序从case 3: 这个入口进去,执行完 “printf(“星期三\n”);”后,没有让其停下来的语句,此时就会接着往后执行,直到输出星期天为止。
case决定入口,break决定出口。
2.2.2:default子句
这时又有一个新的问题,当我们输入8的时候,没有与之匹配的case。这时该怎么办呢?
按照上面的代码,输入8后什么结果也不会有,如果想对其进行提示,告诉他输错了,该怎么办呢?此时就要用到我们的default了。
default就是当所有的case都不匹配的时候,就会执行default后面的子句。
switch语句里面的case和default只要逻辑上是对的,他们没有顺序可言,也就是说可以随便交换两个case的位置都不会对程序造成任何影响。但习惯上我们会把default子句放在最后面
2.2.3:switch语句的语法要求
- switch后面括号里的表达式必须是一个整形表达式。
switch(整型表达式) { 语句项; }
我们定义一个浮点型变量f,让它=1.2,然后把它放进switch后面的括号里去,这时程序就会报错了。
- case 后面必须是整型常量表达式
比如我们可以把“ case 2:”写成“ case 1 + 1:”这样也是可以的,但千万不能是变量。
这里我们定义了一个变量n让它等于2,然后把这个n放到case后面,这时程序就会报错。
2.2.4:case后面不一定需要break
如果我们希望输入1-5的时候程序输出工作日,输入6-7的时候程序输出休息日,正常思路我们会把代码写成下面这样:
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"); default: printf("选择错误\n"); break; } return 0; }
但其实我们还有一种更好的方法,就是把代码写成下面这样:
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"); default: printf("选择错误\n"); break; } return 0; }
当day为1-5中的任何一个数字,程序从相应的case入口进去后,就比如当程序从case 3:进去后,由于没有break暂停跳出,程序会一直往下执行,当执行完case 5:中的 printf(“工作日\n”);后,遇到了break,此时程序就会跳出switch。此时代码就显得十分简洁。
当多个case要执行同一条语句的时候,就可以按照上面的方法去写代码。
2.2.5:练习
大家可以看看下面这段代码,判断一下程序的结果是什么。
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,你有没有作对呢?其实只要注意break,这道题是很容易作对哒。break只会跳出本次所在的switch。另外,switch是可以嵌套的。
今天就分享到这里啦,喜欢的话可以点赞、评论和收藏哟!