C语言学习--分支和循环语句
Posted 庸人冲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言学习--分支和循环语句相关的知识,希望对你有一定的参考价值。
语句结构
C语言是一门结构化的程序设计语言。
C语言的语句结构,从执行流程的角度可以划分出三种基本结构:顺序结构、分支(选择)结构、循环结构。
C语言中由 ; 隔开的就是一条语句。
int main()
{
int a = 0; // 语句1
int b = 1; // 语句2
; // 空语句,也是语句
return 0; // 语句3
}
顺序结构
顺序结构就是从上往下的顺序依次执行语句的结构,是C语言最基本的结构。
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = 0;
c = a;
a = b;
b = c;
printf("a=%d b=%d\\n",a,b );
return 0;
}
分支(选择)结构
为了完成不同的任务,我们通常需要给一段执行代码前加上判断条件,来决定是否执行相应的代码,这种结构就成为分支(选择)结构。
if 语句
if语句分为: if、if else 、if else if … else;
if
int main(){
if(表达式) // 如果表达式为真,执行语句1
{
执行语句1;
}
// 表达式为假,继续执行下面语句
return 0;
}
举例
int main()
{
int age = 10;
if(age<18)
{
printf("未成年");
}
// 单条执行语句可以省略代码块,个人习惯使用代码块,结构清晰。
}
#include <stdio.h>
int main()
{
int age = 18;
if(age<18)
{
printf("未成年");
}
}
if else
int main()
{
if(表达式) // 如果表达式为真,执行语句1
{
执行语句1;
}
else { // 否则,执行语句2
执行语句2;
}
return 0;
}
举例
#include <stdio.h>
int main()
{
int age = 10;
if(age<18)
{
printf("未成年\\n");
}
else
{
printf("成年了\\n");
}
}
if else if … else
// 只能有一个语句块被执行,按顺序从上往下判断
int main()
{
if(expr1) // if expr1 is true, execute statement 1;
{
statement1;
} else if(expr2) // if expr2 is true, execute statement 2;
{
statement2;
} else if(expr3) // if expr3 is true, execute statement 3;
{
statement3;
} ... // ...
else // else ,execute statment4
{
statment4;
}
return 0;
}
举例
#include <stdio.h>
int main()
{
int age = 10;
if(age<18)
{
printf("未成年\\n");
}
else if((age>=18)&&(age<28))
{
printf("青年\\n");
}
// 注意:(18<=age<28) 这种写法是错误的,系统会先判断18<=age,再将判断返回的真值与28比较,为真时返回1<28,为假时返回0<28,这种判断条件永真。
else if((age>=28)&&(age<60))
{
printf("壮年\\n");
}
else if((age>=60)&&(age<150))
{
printf("老年\\n");
}
else
{
printf("respect\\n");
}
return 0;
}
// 太多了,不截屏了
悬空else 问题
// 下面代码的输出结果?
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
if (a == 0)
if (b == 2)
printf("haha\\n");
else
printf("hehe\\n");
return 0;
}
因此建议使用代码块{}将执行语句包裹,会使得程序的结构化更加清晰,编译器也能编译出我们想要的效果。
if 书写形式对比
例一
下面代码意思是否一样?
if(expr)
{
return x;
}
return z;
if(expr)
{
return x;
}
else
{
return z;
}
上述代码的意思是一样的,return x 会直接跳出当前函数,不会执行return 后面的语句。
因此为了不产生歧义,使用第二种书写方式的代码风格是更加清晰的。
例二
下面代码的输出结果为?
int main()
{
int a = 0;
if(a = 1)
{
printf("1\\n");
}
else
{
printf("0\\n");
}
return 0;
}
输出结果为1, 因为 = 是赋值操作符,等于给a重新赋值为1,条件永真。
为了避免这类错误,可以将常量放在 == 右侧,变量放在 == 左侧
int main()
{
int a = 0;
if(1 == 0) // 这样书写即使少写一个 = 代码也会报错
{
printf("1\\n");
}
else
{
printf("0\\n");
}
return 0;
}
练习
判断一个数是否为奇数
先分析:
- 奇数不能被2整除的整数,假设奇数x,则x%2=1;
#include <stdio.h>
int main()
{
int num = 0;
printf("请输入一个整数>:");
scanf("%d", &num);
if (1 == num % 2)
{
printf("%d is a odd number\\n", num);
}
else
{
printf("%d is a even number\\n", num);
}
return 0;
}
输出1~100之间的奇数
分析:
-
奇数是不能被2整除的整数,假设奇数x,则x%2=1;
-
偶数一定是2的倍数,1一定是奇数,因此从1开始查找每次+2,跳过所有偶数。
-
利用循环遍历1~100的数。
#include <stdio.h>
int main()
{
for (int i = 1; i <= 100; i += 2)
{
if (i % 2 == 1)
{
printf("%d ", i);
}
}
return 0;
}
switch语句
switch语句常用于多分支情况。
语法
switch(int_expr)
{
case const_expr1:
statement1;
case const_expr2:
statement2;
break;
case const_expr3:
statement3;
...
default :
statment4;
break;
}
-
switch语句中的表达式(int_expr)必须是整型表达式。
-
case 后面的表达式(const_expr)必须是整型常量表达式。
-
int_expr 会按照顺序结构从上往下依次对比 const_expr,哪个相等就从哪个case开始执行。
-
当执行完毕后,如果case里的执行语句含有break; 则跳出当前switch语句,如果没有break;则继续执行下面的case。
-
当所有expr与所有case的 const_expr 都不相等,如果有 default 默认执行 default 里面的语句。如果没有则结束switch语句。
-
default 的位置不影响switch语句的执行顺序。
-
分支语句中不能使用continue;
举例
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
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;
}
如果case中没有break; 执行继续执行当前case之后的语句,直到遇到break; 或者switch语句全部执行完毕。
// 例如将说有break;删除,并输入1,查看最终的输出结果
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
printf("星期一\\n");
case 2:
printf("星期二\\n");
case 3:
printf("星期三\\n");
case 4:
printf("星期四\\n");
case 5:
printf("星期五\\n");
case 6:
printf("星期六\\n");
case 7:
printf("星期天\\n");
default:
printf("输入值不正确\\n");
}
return 0;
}
结果如下:
练习
下面代码的输出结果为?
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch(n)
{
case 1: m++;
case 2: n++;
case 3:
// switch语句可以嵌套使用
switch(n)
{
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
代码分析
int main()
{
int n = 1;
int m = 2;
switch(n)
{
case 1: m++; // n = 1首先进入 case 1:m++; m = 2 + 1 = 3
case 2: n++; // 接着 n++; n = 1 + 1 = 2
case 3: // 接着 进入 case 3:
switch(n)
{
case 1 : n++;
case 2 : // n = 2 进入 case 2:
m++; // m = 3 + 1 = 4
n++; // n = 2 + 1 = 3
break; // 跳出当前的这个嵌套的switch
}
case 4: // 继续执行 case 4:
m++; // m = 4 + 1 = 5
break; // 跳出当前switch循环
default:
break;
}
printf("m = %d, n = %d\\n", m,n); // m = 5 n = 3
return 0;
}
循环结构
- 循环结构(语句),有规律的执行重复的操作,被重复执行的语句称为循环体。
- 循环语句中的判断表达式用于判断循环的终止条件。
- 条件为真继续循环,条件为假终止循环。
- 循环语句分为3种:while、for、do while。
while循环
先判断,当表达式为真进入循环,为假终止循环。
注意切勿使while循环的判断表达式永真,会成为死循环。
语法
while(expr)
{ // 循环体
statement;
}
举例
打印1~10
分析:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10) // 当i>10时 条件式为假,结束循环
{
printf("%d ", i);
i++;
}
return 0;
}
break和continue
break 终止整个循环
// 假如你买了5个包子,当吃到第三个时,你开始拉肚子...
int main()
{
int i = 1;
while (i <= 5)
{
printf("正在吃第%d包子\\n", i);
if (3 == i)
{
printf("拉肚子了,上医院\\n");
break;
}
i++;
}
return 0;
}
continue 跳出本次循环,后面的代码本次不再不执行,继续下次循环
// 假如你买了5个包子,当吃到第三个时,吃到一个虫子...
int main()
{
int i = 1;
while (i <= 5)
{
printf("正在吃第%d包子\\n", i);
if (3 == i)
{
printf("有虫子,丢掉,接着吃\\n");
i++;
continue;
}
i++;
}
return 0;
}
注意
continue 后面如果有对条件表达式中变量的操作,例如 ++ – 等,很容易造成死循环。
// 例如上面的代码
int main()
{
int i = 1;
while (i <= 5)
{
printf("正在吃第%d包子\\n", i);
if (3 == i)
{
printf("有虫子,丢掉,接着吃\\n");
// i++; 这里如果不写i++,就变成死循环
// i == 3时 跳出本次循环,i没有+1,i == 3,继续进入if语句,一直重复就变成死循环了
continue;
}
i++;
}
return 0;
}
while循环的一些实际应用
下面代码的意思是?
#include <stdio.h>
int main()
{
int ch = 0;
while((ch= getchar()) != EOF) // getchar 接收一个字符,当 ch == EOF时,终止循环。
以上是关于C语言学习--分支和循环语句的主要内容,如果未能解决你的问题,请参考以下文章