C语言中有三大结构:顺序借口,选择结构,循环结构。其中选择结构又称分支结构。下面我将基础的介绍一下分支与循环结构。
分支结构
1. if语句
if语句的基础语法如下:
if(表达式)
语句
如果一个表达式成立,它就会返回一个非零值,一般情况下,这个非零值为1;如果为假则会返回0;在C语言中,0代表假,非0代表真。当表达式为真时程序就会执行下面的语句,表达式为假时则不进行任何操作,这里的语句只是一个单一语句,如果有多条语句就要先用"{}"花括号括起,使之成为一个复合语句。如果想让程序在表达式为假的情况下执行其他语句,则需要引用else,使if语句变成
if(表达式)
语句1
else
语句2
的形式,当表达式为真时执行语句1,为假时执行语句2;
比如:输入一个数,判断它是正数还是非正数,并打印出结果,代码如下:
#include<stdio.h>//引用标准输入输出头文件
int main()
{
int a = 0;//变量初始化
scanf("%d", &a);
if (a > 0)
printf("这个数是正数");
else
printf("这个数不是正数");
return 0;
}
运行结果如下:
4
这个数是正数
if else 语句还支持多层嵌套以面对现实生活中更复杂的的逻辑判断。
比如:输入一个数,判断它是正数还是负数或零,如果是正数,判断它是基数还是偶数,并打印出结果,代码如下:
#include<stdio.h>//引用标准输入输出头文件
int main()
{
int a = 0;//变量初始化
scanf("%d", &a);
if (a > 0)
{
printf("这个数是正数\n");
if (0 == a % 2)
printf("这个数是偶数\n");
else
printf("这个数是奇数\n");
}
else
{
if (0 == a)
printf("这个数是0");
else
printf("这个数是负数");
}
return 0;
}
输出结果为:
3
这个数是正数
这个数是奇数
我们也可以把else下的花括号{}省略变成
#include<stdio.h>//引用标准输入输出头文件
int main()
{
int a = 0;//变量初始化
scanf("%d", &a);
if (a > 0)
{
printf("这个数是正数\n");
if (0 == a % 2)
printf("这个数是偶数\n");
else
printf("这个数是奇数\n");
}
else if (0 == a)
printf("这个数是0");
else
printf("这个数是负数");
return 0;
}
注意:如果有多个if else,要记住else总是和最近的if相匹配。
比如:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
if (1 == a)
if (2 == b)
printf("Hello");
else
printf("Word");
return 0;
}
代码中的else其实是和if(2 == b)相匹配的,更清楚的代码形式是
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
if (1 == a)
{
if (2 == b)
printf("Hello");
else
printf("Word");
}
return 0;
}
2. switch语句
因为switch有开关的意思,它有时也被叫做“开关语句”,switch的语法如下:
switch(表达式)
{
case 数值1:语句1;break;
case 数值2:语句2;break;
case 数值3:语句3;break;
……………………
default:语句;break;
}
程序会把表达式的值与下面的数值相比较,一旦它们相等,就会执行后面对应的语句。并使用break跳出switch语句,如果没有符合的值则执行default后的语句.
这里要注意的是,这里的表达式必须是整型表达式,数值也必须是整型;除此之外,数值也必须是常量,而不能是变量。其中case和default并没有严格的顺序结构,你也可以把default写在case前。
循环结构
1. while语句
while语句的语法如下:
while(表达式)
{
语句
}
如果表达式为真,则一遍又一遍地循环执行程序,表达式为假,则会跳出循环。
比如,编写一个程序,打印1~10的数:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
程序运行结果为下:
1 2 3 4 5 6 7 8 9 10
2. for语句
for语句是C语言中使用最普遍的循环语句,其语法形式如下:
for(表达式1;表达式2;表达式3)
{
语句;
}
它的运行逻辑是先用表达式1为变量设置初始值,当表达式2成立时,执行下方的语句,再执行表达式3,对变量进行调整。比如,编写一个程序,找到1~100里所有3的倍数。
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 100; i++)
{
if (0 == i % 3)
printf("%d ", i);
}
return 0;
}
执行结果如下:
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
3.do while语句
do while语句的语法如下:
do{
语句
}while(表达式)
do while语句是使用最少的循环语句,一般只用于一些特别场合。与while、for语句之间的明显差别是,如果条件刚开始就不成立,while和for一次都不会执行下方的语句,而是会直接跳出循环,而do while会先执行下方的语句,之后再依据表达式的结果去判断是否进行下一次循环;如果表达式为真就进行下一次循环,如果为假就跳出循环。那些特别的场合利用的就是do while的这个特点
下面我们就举个例子。
输入一个数,判断它是一个几位数:
#include<stdio.h>
int main()
{
int i = 0;
int k = 1;
printf("请输入初始值\n");
scanf("%d", &i);
do
{
i = i / 10;
if (i)
k++;
} while (i);
printf("这个数是%d位数", k);
return 0;
}
即使输入的数字是0,也能打印出“这个数是1位数”,这是for while所替代不了的。
转向语句
说到循环语句,自然离不开转向语句:break;continue;goto;
他们都可以不同程度地使程序跳出循环,
-
break的作用是永久地终止循环,只要brak被执行就直接跳出循环,执行下面的语句
-
continue则是仅跳过当前循环,如果表达式成立继续执行下一循环
-
goto的作用是使程序跳转到预先设置好的标点处。
#include<stdio.h> int main() { int i = 1; while (i <= 100) { if (0 == i % 3) printf("%d ", i); i++; } printf("\n"); for (i = 1; i < 100; i++) { if (66 == i) break; if (0 == i % 3) printf("%d ", i); } return 0; }
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63
如果把break改成continue会怎么样呢?
结果变成了:
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 69 72 75 78 81 84 87 90 93 96 99
最有意思的是continue与while或者do while结合;
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 100)
{
if (0 == i % 3)
printf("%d ", i);
i++;
}
printf("\n");
i = 1;
do
{
if (0 == i % 3)
printf("%d ", i);
if (66 == i)
continue;
i++;
} while (i <= 100);
return 0;
}
当程序执行时,我们发现程序陷入了死循环,不停地打印“66”,让我们分析一下:
、
当i = 66时,它会执行continue,跳出这个循环,然后由于没有执行i++,下一次循环i仍然是66,于是就会陷入死循环。
for语句中的循环变量调整每次循环结束都会执行的,但while和do while的循环变量调整环节是在循环中进行的,容易因为continue而跳过,进而陷入死循环。
至于goto语句,由于它会让程序跳转到其它位置,打乱程序原有的执行流程,因此大多数教材都建议尽量不使用;不过goto并不是一无是处,在面临多层循环嵌套时,一个break只能跳出一层循环,但goto可以一次性跳出多层循环,此时使用goto就非常方便了。