1、语句的定义
C语言的语句可以分为以下几类
1. 表达式语句 2. 函数调用语句 3. 控制语句 4. 复合语句 5. 空语句
函数调用语句
如printf(“Hello world.”);
表达式语句
如赋值表达式a=3;,++i;等
空语句
直接只有一个分号的一行语句。
复合语句
用{}将语句和声明括起来的复合语句,也称语句块
控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语 言有九种控制语句。 可分成以下三类:
1. 条件判断语句也叫分支语句:if语句、switch语句;
2. 循环执行语句:do while语句、while语句、for语句;
3. 转向语句:break语句、goto语句、continue语句、return语句。
2、分支语句
if 语句
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
如果表达式的结果为真,则语句执行。
在C语言中如何表示真假?
0表示假,非0表示真。
如果条件成立,要执行多条语句,怎应该使用代码块。
#include <stdio.h>
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
常见问题
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匹配,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;
}
if中判断的书写格式
//代码1
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代码2
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
一般变量和常量进行比较的时候,最好将常量写在左边,避免将==写成=导致的错误难以发现
从而可以看出代码的风格比较重要
switch语句
switch(整型表达式)
{
case 整形常量表达式:
语句;
}
在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;
}
若想要实现以下的要求则
1. 输入1-5,输出的是“weekday”;
2. 输入6-7,输出“weekend”
#include <stdio.h> //switch代码演示 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; }
可见break语句的实际效果是把语句列表划分为不同的分支部分。
switch(整型数据(包括枚举型)或字符型数据) {
case 常量1: 语句1; break;
case 常量2: 语句2; break;
case 常量3:
case 常量4: 语句3; break;//此时常量3和常量4都进入到语句3
...
default: 语句n;(没有default时不符合则跳过)
}
//对于if、switch等选择语句,通常把正常情况,也即出现可能性最大的分支放前面,而可能性小的分支放后面
如果所有case都不能匹配的话,可以在switch语句中加上default语句,当所有的case都不匹配则执行default中的语句,default语句可以放在任何位置,但是switch语句中只能出现一次。
编程的好习惯:最后一个case语句和default语句都加上break。
练习1
#include <stdio.h>
int main()
{
int x = 3;
int y = 3;
switch (x % 2)
{ // x%2的结果为1,因此执行case1
case 1:
switch (y) // y是3,因此会执行case3,而case3不存在,那只能执行default
{
case 0:
printf("first");
case 1:
printf("second");
break;
default: printf("hello"); // 打印hello,打印完之后,内部switch结束,此时外部case1结束
} // 因为外部case1之后没有添加break语句,所以继续执行case2
case 2: // 打印third
printf("third"); // 外部switch结束
}
return 0;
练习2
#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;
}
输出结果:5 3
3、循环语句
while循环
类似于if语句
if(条件)
语句;
但是if语句只会执行一次
如果需要重复循环执行多次的话,可以使用while语句
//while 语法结构
while(表达式)
循环语句;
while语句执行过程:
while语句的使用:实现打印1~10
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
while语句中的break和continue
//break 代码实例
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
代码输出结果:1 2 3 4
//continue 代码实例1
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
代码输出结果:打印1~4后进入死循环
由此可知
在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
代码案例
//代码1
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的.
//输入函数都是从缓冲区中读取数据的
//比如说在scanf读取缓冲区的时候,把scanf未读取的数据清理掉,
//scanf不会读取空格和换行,空格和换行会留在缓存区
//代码2
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < ‘0’ || ch > ‘9’)
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的
for循环语句
for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
对比while语句和for语句
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
for循环中的break和continue
//代码1
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
//代码2
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
使用for循环的建议:
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
for循环的其他形式
#include <stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}
//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
//代码2
int i = 0;
int j = 0;
//这里打印多少个hehe?
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
printf("hehe\n");
}
}
//代码3
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
//代码4-使用多余一个变量控制循环
int x, y;
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
do...while循环语句
循环至少执行一次,使用的场景有限,所以不是经常使用。
do
循环语句;
while(表达式);
循环语句的典型案例
求n的阶乘
int main()
{
int n = 0;
scanf("%d", &n)
int ret = 1;
for(i = 1; i <= n ;i++)
{
ret *= i;
}
print("%d\n", ret);
return 0;
}
计算 1!+2!+3!+……+10!
方法一
int main()
{
int n = 0;
int ret = 1;
int sum = 0;
for(n = 1; n<=10; n++)
{
ret = 1;
for(i = 1; i <= n ;i++)
{
ret *= i;
}
sum +=ret;
}
print("%d\n", sum);
return 0;
}
方法二
int main()
{
int n = 0;
scanf("%d", &n)
int ret = 1;
int sum = 0;
for(i = 1; i <= n ;i++)
{
ret *= i;
sum += ret;
}
print("%d\n", sum);
return 0;
}
在有序数组中查找某个具体的数字(二分查找法)
实现在主函数内:
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left = 0;
int right = sizeof(arr)/sizeof(arr[0])-1;
int key = 7;
int mid = 0;
while(left<=right)
{
mid = (left+right)/2;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
break;
}
if(left <= right)
printf("找到了,下标是%d\n", mid);
else
printf("找不到\n");
}
函数实现
int bin_search(int arr[], int left, int right, int key)
{
int mid = 0;
while(left<=right)
{
mid = (left+right)/2;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
return mid;
}
return -1;
}
猜数字游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("**********************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
int random_num = rand() % 100 + 1;
int input = 0;
while (1)
{
printf("请输入猜的数字>:");
scanf("%d", &input);
if (input > random_num)
{
printf("猜大了\n");
}
else if (input < random_num)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}