文章目录
一、程序中的选择结构(if)
- if的用法
上代码:
#include <stdio.h>
int main()
{
short a = 1;
short b = 2;
int c = a - b;
if( c > 0 )
{
printf("a > b\n");
}
else
{
printf("a <= b\n");
}
return 0;
}
下面为输出结果:
- if ... else ...剪裁与组合
- 裁剪
- if 可以不带 else 分支,条件为真时,则执行对应的语句
- if 和 else 都可以不使用 { } ,此时每个分支只对应一条语句
- 组合
- else 后的语句可以是另一个 if ...else ...
- 多个 if ...else ...组合在一起可描述多路选择分支
- 裁剪
上代码:
#include <stdio.h>
int main()
{
short a = 2;
short b = 2;
int c = a - b;
if( c > 0 )
printf("a > b\n");
else if( c == 0 )
printf("a == b\n");
else
printf("a < b\n");
return 0;
}
下面为输出结果:
- 小结
- 分支结构是程序设计语言中的重要结构
- C语言中通过 if ...else ...对代码进行分支执行
- 可以对 if ... else ...进行剪裁和组合,描述更多的执行分支
- if 分支可以独立存在,else 分支不能独立存在,必须跟在 if 之后
- else 和最近的 if 匹配(就近原则)
二、switch多分支选择语句
- switch-更简洁的多分支选择结构
上代码:
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
char sign = 0;
printf("Input a sign: ");
scanf("%c", &sign);
switch(sign)
{
case '+':
printf("%d + %d = %d\n", a, b, a + b);
break;
case '-':
printf("%d - %d = %d\n", a, b, a - b);
break;
case '*':
printf("%d * %d = %d\n", a, b, a * b);
break;
default:
printf("Unsupported Sign: %c\n", sign);
}
return 0;
}
下面为输出结果:
- switch 实验小结
- switch 仅能适用于离散变量或值(整数值)
- case 是分支入口,匹配成功后执行 case 下的语句
- 当语句全部执行后,需要使用 break 跳出执行分支
- default 分支不是必须的(类似于 else 分支不是必须的)
- switch 语句的分支合并技巧
上代码:
#include <stdio.h>
int main()
{
int num = 0;
printf("Input a number: ");
scanf("%d", &num);
switch( num )
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("%c\n", 'A' + (num - 1));
break;
default:
printf("Invalid Input\n");
}
return 0;
}
下面为输出结果:
- 小结
- switch 是一种更简洁的分支选择结构
- switch 仅能适用于整数(小数不可用)
- case 是分支入口,匹配成功后执行case下的语句
- 当语句全部执行后,需要使用 break 跳出执行分支
- 多个 case 可合并在一起,执行相同的语句
三、while循环结构
- while - 循环结构的直接支持
上代码:
#include <stdio.h>
int main()
{
int sum = 0;
int i = 1;
while( i <= 100 )
{
sum = sum + i;
i = i + 1;
}
printf("sum = %d\n", sum);
printf("i = %d\n", i);
return 0;
}
下面为输出结果:
- 进阶while循环
- 循环体可能一次也不执行(如: while( 0 ) )
- 循环条件必须被改变,否则循环永远不会结束(如:while( 1 ) )
- if 语句(不带 else )可以看作特殊的循环(最多执行1次循环体)
- if 语句与 while 语句可相互组合嵌套实现复杂功能
上代码:
#include <stdio.h>
int main()
{
int sum = 0;
int i = 1;
while( i <= 1000 )
{
if( (i % 3) == 0 )
{
sum = sum + i;
printf("i = %d\n", i);
}
i = i + 1;
}
printf("sum = %d\n", sum);
return 0;
}
下面为部分输出结果:
- 小结
- 循环结构是程序设计语言中的重要结构
- C语言中通过while 对代码进行循环执行
- 可以对if while进行剪裁和组合,实现更复杂的功能
- 循环体中需要有代码改变循环条件,否则循环不会结束
- while语句之间可以相互嵌套,构成多重循环
- while语句和if语句之间也可以相互嵌套
- if 语句可以看作只循环一次的 while 语句
- while语句可以看作扩展的 if 语句
while(...)
if(...)
while(...)
{
}
四、do...while 与 for
-
do...while 循环结构
- do...while 的构成与执行
- do 是循环的开始,while 是循环的结束
- do..while 可以看做一条语句,需要以分号结束
- do...while 是否继续循环依赖于括号中的循环条件
- do...while 至少执行一次循环体
上代码:
#include <stdio.h>
int main()
{
int sum = 0;
int input = 0;
int i = 0;
while( i > 100 )
printf("while( i > 0 )\n");
do
printf("do...while( i > 0 )\n");
while( i > 100 );
do
{
printf("Input: ");
scanf("%d", &input);
sum = sum + input;
} while( sum < 100 );
printf("sum = %d\n", sum);
return 0;
}
下面为输出结果:
这里注意一个问题:while 和 do...while 的区别,可以看到 i 为 0 时,while 循环里面的不会执行,而 do...while 会执行一次。
- 循环结构的套路
- 初始化循环变量
- 在循环体中改变循环变量
- 判断循环条件是否为真
- 真:执行循环体
- 假:结束循环
- for循环结构(更简洁的循环结构)
for ( 0.初始化循环变量; 1.循环条件; 3.改变循环变量 )
{
2.循环体;
}
可以用下面的图表示:
上代码:
#include <stdio.h>
int main()
{
int esum = 0;
int osum = 0;
int i = 0;
for(i=1; i<=100; i=i+2)
{
osum = osum + i;
esum = esum + (i + 1);
}
printf("osum = %d\n", osum);
printf("esum = %d\n", esum);
return 0;
}
下面为输出结果:
- for循环注意事项
- for循环的各个部分(0,1,2,3)都是可选的
- 花括号可省略,省略花括号则循环体仅为一条语句
- for( ...; ...; ... )其中的分号不可省略
for ( 0.初始化循环变量; 1.循环条件; 3.改变循环变量 )
{
2.循环体;
}
上代码:
#include <stdio.h>
int main()
{
int sum = 0;
int i = 1;
for(; i <= 100; )
{
sum = sum + i;
i = i + 1;
}
printf("sum = %d\n", sum);
return 0;
}
下面为输出结果:
- 小结
- do...while是至少执行一次循环体的循环结构
- do...while 先执行循环体再判断循环条件
- for是 while的进化,在写法上更加精简
- for 与 while 相同,先判断循环条件再执行循环体
五、break和continue
- 再论break
- break 能够强制结束当前结构,阻止程序向下执行
- switch分支选择结构, break立即结束switch
- 循环结构,break立即结束循环(忽略循环条件的真假)
上代码:
#include <stdio.h>
int main()
{
int sum = 0;
int i = 1;
while( 1 )
{
sum = sum + i;
if( i == 100 )
break;
i = i + 1;
}
printf("sum = %d\n", sum);
printf("i = %d\n", i);
return 0;
}
下面为输出结果:
再上一段代码:
#include <stdio.h>
int main()
{
int target = 30;
int input = 0;
for(;;)
{
printf("Input: ");
scanf("%d", &input);
if( input == target )
break;
else if( input < target )
printf("It's small!\n");
else if( input > target )
printf("It's big!\n");
}
printf("Target = %d\n", input);
return 0;
}
下面为输出结果:
- break遵循最近匹配原则
- break 总是与离它最近的对应关键字匹配
- 关键词指的是在C语言中有特殊含义的单词,如:while,for,switch等。
- 注:C语言中的变量名不能是关键字
上代码:
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i=i+1)
{
switch( i % 2 )
{
case 0:
printf("%d is even number!\n", i);
break;
case 1:
printf("%d is odd number!\n", i);
break;
}
}
return 0;
}
下面为输出结果:
可以看到,break 对应的是 switch ,而不是 for,这就是 break 的最近匹配原则。
再上一段代码:
#include <stdio.h>
int main()
{
int k = 0;
int input = 0;
printf("Input: ");
scanf("%d", &input);
switch( input % 2 )
{
case 0:
printf("case 0\n");
for(k=0; k<=2; k=k+1)
if( k )
break;
break;
case 1:
printf("case 1\n");
break;
}
return 0;
}
下面为输出结果:
如果把case 0 下面的 break 去掉一个,那么输出结果就会变成下面这样:
这还是因为 break 的最近匹配原则,去掉一个 break 后,break匹配的就是 for 了,所以也会输出第二个 case 后面的内容。
- continue一循环体终结者
- continue 是C语言中的关键字之一
- continue 立即结束当前循环体,直接进入下一轮条件判断
- continue 与 break 不同,并不会结束整个循环
上代码,打印1000以内能被7整除的整数,并统计数量:
#include <stdio.h>
int main()
{
int i = 0;
int n = 0;
for(i=1; i<1000; i=i+1)
{
if( i % 7 )
continue;
printf("%d ", i);
n = n + 1;
}
printf("\n");
printf("Count: %d\n", n);
return 0;
}
下面为输出结果:
- 小结
- break 忽略循环条件的真假,立即结束循环
- break 总是与离它最近的对应关键字匹配
- continue 结束当前循环体,直接进入下一轮条件判断
- continue 结束循环体的单次执行,并不会结束整个循环