目录
一、C语言的语句有哪些
1. C语言代码由一条条语句构成,每条语句的结束标志是封号。
2. C语言的语句有5大类分别是空语句、表达式语句、函数调用语句、复合语句和控制语句。
1.1 空语句
1. 概念:封号前面什么都不写的一条语句称为空语句。
2. 用法:这里需要一条语句,但不希望这条语句其任何作用。
int main()
{
;//空语句
return 0;
}
1.2 表达式语句
1. 问:编程语言中表达式可以由什么构成?
答:一个操作数、一个操作数和一个运算符、两个操作数和一个操作符,多个操作数和多 个操作符,例如:1,i++,1+2,1+2*3,c=a+b。
2. 概念:封号前面是表达式的一条语句称为表达式语句。
int main()
{
int i = 0;
int a = 0, b = 0, c = 0;
1;//表达式语句
i++;//表达式语句
1 + 2;//表达式语句
1 + 2 * 3;//表达式语句
c = a + b;表达式语句
return 0;
}
1.3 函数调用语句
1. 概念:封号前面是函数调用的一条语句称为函数调用语句。
2. 用法:在需要利用具有某功能的函数时使用,分为库函数的调用和自定义函数的调用。
int Add(int a, int b)
{
return a + b;
}
int main()
{
int a = 1;
int b = 2;
int sum = Add(a, b);//自定义函数的函数调用
printf("%d\n", sum);//库函数的函数调用
return 0;
}
1.4 复合语句
1. 概念:被{ }包裹起来的所有语句,整体被称为复合语句。
2. 补充:一个{ }被称为一个代码块。
//在屏幕上打印用*组成的金字塔,行高列宽均为4
int main()//复合语句1
{
int i = 0;
for (i = 0; i < 4; i++)//复合语句2
{
int j = 0;
//空白
for (j = 0; j < 4 - 1 - i; j++)//复合语句3
{
printf(" ");
}
//星星
for (j = 0; j <= i; j++)//复合语句4
{
printf("*");
}
//换行
printf("\n");
}
return 0;
}
1.5 控制语句
1. 概念:控制语句共9种,用于控制程序的执行流程,实现顺序、选择和循环结构。
① 选择语句:if_else语句、switch语句
② 循环语句:while语句、do_while语句、for语句
③ 转向语句:break语句、continue语句、goto语句、return语句
二、分支语句(两种)
1.1 if语句
1.1.1 普通if语句(if、if_else)
1. 如果表达式成立就执行...否则就执行...。
2. if 和 else 默认只能控制一条语句,相同时控制多条语句需使用{ }括起来。
3. 如果一个if_else语句不能准确表达意思可以尝试用多个独立的if_else语句。
1.1.2 嵌套if语句
1. 第一种写法:如果表达式1成立并且表达式2成立就执行...否则就执行...。
2. 第二种写法:如果表达式1不成立的基础上表达式2成立就执行...否则就执行...。
3. 第三种写法:和第二种表达的效果一致,只是同种意思不同表达形式而已,不过if_else if _else 通常用于将主线直接分成几部分的情况,复杂的嵌套常采用第二种写法。
4. if_else (if_else) 和 if_else if _else本质的意思都是将表达式1不成立的部分继续拆分为更小的几部分。
5. 总之,if语句的嵌套,其实就是将分支单元划分为更小的分支单元。if中直接嵌套if表示条件的条件,eles中嵌套if,普通写法表示将上一个条件不满足的部分划分为更小的分支单元,而 if_else if _else 写法和普通写法的表达意思一样,其常用于题目中有明显想将主线划分为多个并列分支单元的意向。
1.1.3 else嵌套if两种写法的比较
//else嵌套if两种写法的比较:
//两种写法本质是一个意思,只是在于使用者喜欢怎样去使用
//题目:判断整型n是正数、负数还是0
//写法一:
int main()
{
int n = 0;
scanf("%d", &n);
//判断
if(n > 0)
{
printf("%d是正数\n", n);
}
else//else部分就只剩下<=0的情况了
{
//理解成剩余部分再划分的写法
if(n < 0)
{
printf("%d是负数\n", n);
}
else
{
printf("%d是0\n", n);
}
}
return 0;
}
//写法二:
int main()
{
int n = 0;
scanf("%d", &n);
//判断
if(n > 0)
{
printf("%d是正数\n", n);
}
else if(n < 0)//理解成主线划分的多个并列的分支写法
{
printf("%d是负数\n", n);
}
else
{
printf("%d是0\n", n);
}
return 0;
}
1.1.4 else悬空问题
1. 问题起源:在写C语言题目或读别人的代码时,由于代码可读性差导致我们无法准确判断if语句中的else到底是跟着哪个if,因而造成了else悬空问题。
2. 解决方法:代码从上往下读,只要遇到else就根据“else总是与最近的未配对的if配对”原则进行匹配即可。
int main()
{
int a = 1;
int b = 2;
if ( a == 0 )
if ( b == 2 )
printf("123\n");
else
printf("abc\n");
return 0;
}
//这段代码在屏幕上什么都不会打印
//是因为该代码中的else与第二个if配对,而不是与第一个if配对
1.1.5 if语句的代码可读性
//示例1:比较变量a和常数3是否相等,相等就在屏幕上打印hehe
int main()
{
int a = 0;
if (a = 3)//手误写法,最终会造成表达逻辑有误
{
printf("hehe\n");
}
}
//启示:
//变量和常数比较是否相等时,把常数写在左边,变量写在右边
//这样当我们粗心把==写成=时编译器会报警告,而不是继续编译
//示例2:虽节省空间,但可读性差
int main(){
int a = 0;
if (a == 0){
printf("hehe\n");
}else{
printf("haha\n");
}
//启示:
//不能省的空间不要省,无论控制1条还是控制多条语句都写上代码块
//示例3:可读性好
int main()
{
int arr[] = { 1,2,3 };
int sz = sizeof(arr) / sizeof(arr[0]);//定义一维数组后立即计算数组大小
int i = 0;
for (i = 0; i < sz; i++)
{
if (2 == arr[i])//比较常量和变量是否相等时,常量在左,变量在右
{
printf("hehe");//不管控制几条语句,都采用代码块括起来
}
}
return 0;
}
1.2 switch语句(不常用)
1. switch语句可实现多分支,由于使用条件苛刻所以在特定情况下才主动使用switch语句。
2. 苛刻条件:
①switch后面的表达式必须是整型表达式,不能是浮点型的表达式!,不要是常量!!!。
②case后面的值必须是整型常量_表达式,不能是变量!!!(字符是特殊的整型类型,枚举类型也可以)。
3. 需要理解:
①case和default相当于每个分支的入口,而break相当于每个分支的出口,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,直到遇到break语句或者来到switch语句的结尾才会跳出switch语句。
②当所有case都不满足时,才执行default分支,default分支可依据具体情况选择写还是不写
③每个switch语句只能有一个default分支。
④case和default分支没有顺序要求,但dafault通常写在最后面。
⑤switch语句的最后一个分支可以不写break,但最好是写上。
switch(表达式)
{
case 值1:
语句1;
语句2;
...
break;
case 值2:
语句1;
语句2;
...
break;
case 值3:
语句1;
语句2;
...
break;
...
default:
语句1;
语句2;
...
break;
}
//如果day的输⼊不是1~7的值,要提⽰:输⼊错误
#include <stdio.h>
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");
break;
default:
printf("输⼊错误\n");
break;
}
return 0;
}
三、循环语句(三种)
3.1 while循环
1. 特点:循环条件总是比循环体多执行一次,且循环变量需在循环体内部调整。
2. 补充:想要一直循环可以将表达式写成恒真的形式,例如:while(1)。
3. 运行过程:先判断while后面的表达式是否为真,如果为真就执行一次循环体的内容,执行完后,程序又会来到while循环的第一行,继续判断while后面的表达式是否为真;如果为假,程序将跳过整个循环体的代码块,不会执行循环体的任何内容。
4. 输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如: 输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5
5. 题⽬解析:① 要想得到n的最低位,可以使⽤n%10的运算,得到的余数就是最低位,如:1234%10得到4 ② 要想去掉n的最低位,找出倒数第⼆位,则使⽤ n=n/10 操作就可以去掉最低位的,如: n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第⼆位3。 ③ 循环1和2两个步骤,在n变成0之前,就能到所有的位。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d ", n%10);
n /= 10;
}
return 0;
}
3.2 do_while循环(不常用)
1. 特点:循环体至少执行一次,且循环变量需在循环体内部调整。
2. 注意:do_while中while后面的封号别忘记写了。
3. 运行过程:先执行do后面代码块内的所有内容,执行完后来到while所在行,判断while后面的表达式是否为真,如果为真将继续执行一次循环体内的所有内容;如果为假,将跳出循环来到while(表达式)的下一行。
3.3 for循环
1. 表达式1:循环变量初始化部分
表达式2:循环是否继续的条件
表达式3:循环变量的调整
2. 特点:表达式1至执行一次,表达式2总是比循环体多执行一次。
3. 注意:①表达式之间是用封号隔开的 ②表达式1、2、3均可以省略,但并不建议省略 ③for循环的循环条件所含的循环变量不一定要写在表达式3的位置,例如,《国王发金币问题》[NOIP2015]金币_牛客题霸_牛客网 (nowcoder.com)
4. 运行过程:先执行表达式1,再就表达式2的真假判断是否要执行循环体的内容,如果表达式2为真,那么将执行一次循环体内的内容,执行完后,程序将回到for循环的第一行,执行表达式3,执行完后,再次执行表达式2,判断是否要继续执行循环体的内容;如果表达式2为假,程序将跳过整个循环体的代码块,不会执行循环体的任何内容,包括表达式3。
//《国王发金币问题》
解法一:
int main()
{
int k = 0;
scanf("%d", &k);
int day = 0;//已计算的天数
int sum = 0;//发放的金币总和
for(int money = 1; day < k; money++)
{
for(int i = 0; i < money; i++)
{
sum += money;
day++;
if(day == k)
{
break;
}
}
}
//输出
printf("%d\n", sum);
return 0;
}
//解法二:
int main()
{
int k = 0;
scanf("%d", &k);
int day = 0;//已发金币的天数
int money = 1;
int sum = 0;
while (money)
{
int i = 0;
for (i = 0; i < money; i++)
{
sum += money;
day++;
if (day == k)
{
goto next;
}
}
money++;
}
next:
//输出结果
printf("%d\n", sum);
return 0;
}
3.4 循环嵌套的练习
//【打印100~200之间的素数】
int main()
{
int i = 0;
//循环产⽣100~200的数字
for(i=101; i<=200; i += 2)
{
int flag = 1;//假设每次得到的i是素数
int j = 0;
for(j=2; j<=(int)sqrt((double)i); j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
//
if(flag == 1)
{
printf("%d ", i);
}
}
return 0;
}
四、转向语句(四种)
4.1 break 语句
1. 关键字break的作用:只要break在循环体中被执行,就会直接跳出当前所在的一层循环。
4.2 continue 语句
1. 关键字continue的作用:跳过本次循环体中后面的代码。
4.3 goto 语句
1. C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号,goto 语句可以实现在同⼀个函数内跳转到设置好的标号处,标号一定要顶格写。
2. goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以建议能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。
4.4 return 语句
1. return语句后面可以是一个数值,也可以是一个表达式,如果是表达式则会先执行表达式再返回表达式的值。(注意一下:return i++;和return ++i;是不同的意思)
2. return语句后面可以什么也没有写成return;适合函数返回类型为void的情况。
3. return返回的值与自定义函数的返回类型相冲突时,以自定义函数返回类型为尊,返回值将会被隐形强制转换。
4. return语句执行后,自定义函数中return语句后面的代码将不会再被执行。
5. 如果自定义函数的返回类型不为空,函数中存在分支语句,且分支语句中的某个分支中有return语句,那么自定函数所能执行的其他情况都要有return语句来保证函数逻辑的完整性,否则会出现编译错误。如果自定义函数返回类型为空,那么该函数可以有return;来提前终止代码,也可以没有,且函数即使存在分支语句,分支语句中的某个分支中有return语句,此时也不需要去考虑函数执行的其他情况下函数的返回结果的逻辑是否完整了。
五、图片总结
本篇文章已完结,谢谢支持哟 ^^ !!!