目录
C语言是结构化的程序设计语言。
五种语句分类:空语句、表达式语句、控制语句、复合语句、函数调用语句
控制语句是用于控制程序的执行流程,实现程序的各种结构方式。
其中包含三种结构分类:顺序结构、选择结构、循环结构。
C语言有9种控制语句,可以分为以下三类:
- 条件判断语句(也叫分支语句):if 语句、switch 语句;
- 循环语句:for 语句、while 语句、do while 语句;
- 转向语句:break 语句、continue 语句、return 语句、goto 语句
接下来介绍一下三种结构以及9种控制语句
一、顺序结构
顺序结构是一种最基本,最简单的编程结构。程序自上而下依次执行。
#include <stdio.h>
int main()
{
printf("0");
printf("1");
printf("2");
return 0;
}
打印结果:012
// 这里比较简单易懂,不多说啦
二、选择结构
1.条件判断语句
1. if 语句
if语句的几种形式
可以分为三种形式:
单if语句、if...else...语句、if...else if...else..语句。
语法形式如下:
// 1.单if语句
if ( 表达式 )
语句;
注意:这里条件成立后只会执行一条语句
如果想执行多条语句,则要加上{}
if 后使⽤{} 控制多条语句-这个块也叫:程序块,或者复合语句
如下:
if ( 表达式 )
{
语句1;
语句2;
....
}
// 2.if...else...语句
if ( 表达式 )
{
语句1;
}
else
{
语句2;
}
// 3.if...else if...else语句
if ( 表达式 )
{
语句1;
}
else if
{
语句2;
}
...
else
{
语句3;
}
表达式成立(为真,即非0),则执行语句,表达式不成立(为假,即0),则不执行语句。
在C语言中,0表示假,非0表示真。
// 例子:判断一份成绩对应的等级
// 单if实现
#include <stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if(score >= 60)
printf("合格\n");
return 0;
}
// if...else...实现
#include <stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if(score >= 60)
printf("合格\n");
else
printf("不合格\n");
return 0;
}
// if...else if...else实现
#include <stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if(score >= 0 && score < 60)
printf("不合格\n");
else if(score >= 60 && score < 70)
printf("中等\n");
else if(score >= 70 && score < 85)
printf("良好\n");
else if(score >= 85 && score <= 100)
printf("优秀\n");
else
printf("成绩出错\n");
return 0;
}
// 当然也可以用if...else...的嵌套来写
#include <stdio.h>
int main()
{
int score = 0;
scanf("%d", &score);
if(score >= 0 && score < 60)
{
printf("\n");
}
else
{
if(score < 70)
{
printf("中等\n");
}
else
{
if(score < 85)
{
printf("良好\n");
}
else
{
if(score <= 100)
{
printf("优秀\n");
}
}
}
}
return 0;
}
这里注意一下:括号中的判断不合格如score < 60 && score >= 0,初学者比如我,之前就直接写成 0 <= score < 60,其实这种写法没错,但无意义;
原因是:< 的运算符顺序是从左至右,所以 0 <= score < 60 被理解为 (0 <= score) < 60. 如果0 <= score 成立 ( 为真 ) 则结果为1,否则 ( 为假 ) 结果为0. 比如:score取 6, 那么 0 <= score 结果为1,又1 < 60 成立,则结果为 1.
悬空else问题
如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
#include <stdio.h>
int main()
{
int a = 1, b = 3;
if(a == 2)
if(b == 3)
printf("Y\n");
else
printf("N\n");
return 0;
}
这段代码,很多初学者,包括我哈,直接看a不为1,就直接执行else,打印 N 了
#include <stdio.h>
int main()
{
int a = 1, b = 3;
if(a == 2)
if(b == 3)
printf("Y\n");
else
printf("N\n");
}
稍微改变一些对应位置,很容易就可以看出,其实这段代码什么都没打印
对于悬空else的问题,我们只要记住:else总是跟最接近的if匹配
当然这里建议大家,写代码的时候可以养成习惯,
每个条件(或循环)语句后都加上大括号可以让代码看起来更规范整齐,又不易犯错
#include <stdio.h>
int main()
{
int a = 1, b = 3;
if(a == 2)
{
if(b == 3)
{
printf("Y\n");
}
else
{
printf("N\n");
}
}
}
接下来介绍一下,表达式中用于比较的表达式,比如:a < b, a == b 等,通常返回的值为 0 或 1 ,表示真假。
其中主要的6种 <、<=、>、>=、==、!= 这些为关系操作符(运算符),这些大家应该很容易理解的,需要注意的是:比如判断x等于3:if ( x == 3 ).., 有些同学,没错还是我,有次写成了 x = 3 找了半天没找出来错误= =、 为了防止这种错误,借鉴了一些大佬的写法比如 if ( 3 == x ).. ,这样只要 == 误写成 = ,如 if ( 3 = x ) 立马就报错了,因为常量不能被赋值。
再介绍一个条件运算符(也叫三目操作符,顾名思义就是有三个操作数)
条件运算符
形式:表达式1 ? 表达式2 : 表达式3
运算逻辑:表达式1(为真),计算表达式2,否则(为假)计算表达式3 ,整个表达式的结果是计算完的结果
判断两数中最大数
#include<stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
if(a>b)
max = a;
else
max = b;
printf("%d\n", max);
return 0;
}
// 可以改写为
#include<stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
int max = a > b ? a : b;
printf("%d\n", max);
return 0;
}
逻辑运算符:!、&&、| |
主要有三种:
!:取反运算符,改变单个表达式的真假,如:! ( 非0 ) 结果为 0,! 0 结果为 1
&&:与运算符,并且的意思(需要两侧表达式都为真,则为真,否则为假)
| |:或运算符,或者的意思(需要两侧表达式都为假,则为假,否则为真),也可以理解为:两侧至少有一个表达式为真,则为真,否则为假
&&和||都为双目运算符。逻辑运算符有⼀个特点:求值从左到右。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
比如:if(m == 1 | | m==2 | | m == 3) , 假设m为 1,m == 1成立,则后面表达式都不求值判断了; && 同理。
小结:!取反;&&两真为真,一假为假;| | 一真为真,两假为假。
2. switch语句
一种特殊形式的if...else...
switch (整型表达式)
{
case 整型1:
语句1;
case 整型2:
语句2;
....
default:
语句3;
}
运算逻辑:整型表达式的值与case后面的case匹对,执行相应代码块,若没有能匹对的,则执行default的语句。
这里用字符,如'A'也是可以的,应为ASCII码值对应的是整型
注意:
1. case 和后边的整型数字之间要有空格
2. 每个case语句中的代码执⾏完后,要加上break,才能跳出这个switch语句,不然会挨个执行下去
比如:
switch (2)
{
case 1:
printf("1");
case 2:
printf("2");
case 3:
printf("3");
default:
printf("4")
}
switch()括号中2,对应下边case 2,无break,执行结果:234
switch (2)
{
case 1:
printf("1");
case 2:
printf("2");
case 3:
printf("3");
break;
default:
printf("4")
}
执行结果:23
3.case语句和default是没有顺序要求的,只要顺序满足实际需求就可以,通常还是建议default放在最后
4.switch中是没有continue的
三、循环结构
1. 循环语句
(1) while循环
while语法结构和if相似,其中的区别就是while有循环效果
比如:
if(1)
printf("Y"); // 打印一次
while(1)
printf("Y"); // 死循环,打印无数次
while的练习应用
// 求1到100的和
#include <stdio.h>
int main()
{
int i = 1, sum = 0;
while(i <= 100)
{
sum = sum + i;
i++;
}
printf("%d", sum);
return 0;
}
// 逆序打印一个整数的每一位,如:1234,打印4 3 2 1
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d ", n%10);
n /= 10;
}
return 0;
}
(2) for循环
语法形式:
for(表达式1; 表达式2; 表达式3)
{
语句;
}
表达式1:循环变量的初始化, 如:i = 0
表达式2:循环结束条件的判断, 如:i <= 100
表达式3:循环变量的调整, 如:i++
while与for的对比
// 求1到100的和
#include <stdio.h>
int main()
{
int i = 1; // 初始化
int sum = 0;
while(i <= 100) // 判断
{
sum = sum + i;
i++; // 调整
}
printf("%d", sum);
return 0;
}
#include <stdio.h>
int main()
{
int i = 1, sum = 0;
for(i = 1; i <= 100; i++) // 初始化, 判断, 调整
{
sum = sum + i;
}
printf("%d", sum);
return 0;
}
(3) do while循环
语法形式
do
{
语句;
}while(表达式); // 注意do while后边while()结束有带 ;
while和for都是先判断,再执行语句;do while则是先执行语句,再判断
也就是说do while语句中循环体是至少执行一次的
练习
计算一个正整数的位数, 如:1234 输出4
#include<stdio.h>
int main()
{
int n = 0;
int count = 0; // 计数
scanf("%d", &n);
do
{
count++;
n = n / 10;
}while(n);
printf("%d", count);
return 0;
}
2. 转向语句
(1) break和continue
break作用是永久终止本次循环,就是直接跳出本次循环,进入下一次循环;
continue作用是跳过本次循环continue后边的代码,进入下一次循环;
continue在while和for中还是有区别的
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i += 1;
}
return 0;
}
代码结果:先打印1 2 3 4 后边死循环,
原因是:i==5时continue跳过后边代码,也就是i没加1,i还是5,符合if就一直continue死循环了
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ", i);
}
return 0;
}
代码结果:1 2 3 4 6 7 8 9 10
原因是:i==5时,执行continue,跳过了printf后执行调整i++
这里提一下,循环结束后i的值是11,for循环中变量的调整是每次循环体结束后执行,
也就是i==10的时候,执行循环体后,再执行i++为11,进入下一次循环判断11不符合i<=10,结束循环
(2) return 语句
函数执行return语句时,它将返回一个特定的值,并结束当前的函数调用。
这里先简单普及一下,因为很多小伙伴还没学到函数,后面会单独出的
void func() // void 表示无类型,无需返回值时,用void
{
return; // 函数无返回值
}
int add(int a, int b) // int 表示整型,函数体中的return需要返回整型
{
int sum = a + b;
return sum; // 返回sum值
}
初学时写的main是主函数,可以放在任意位置
函数是C语言的主要组成部分
如果多循环中,符合某种条件就想结束本函数
可以如下使用:
#include<stdio.h>
int main()
{
for(...)
{
for(...)
{
if(...)
return 0;
}
}
}
单循环时,
#include<stdio.h>
int main()
{
for(...)
{
...
break; // 这时用return 0;效果是一样的
}
}
先不讲了,怕有人晕了
(3) goto语句
goto 语句可以实现在同⼀个函数 内无条件跳转到指定标签位置执行代码。
#include <stdio.h>
int main()
{
goto n; // n为指定标签,这句话是跳转到指定标签n的位置。
printf("不被执行\n");
n: // 标签的定义
printf("可被执行\n"); // 指定标签包含的代码
return 0;
}
这里的打印结果:可被执行
实际应用中应尽量避免使用goto,在庞大的程序中,用goto容易导致代码不易理解,调试时很难找到错误
在多层循环代码中,如果想快速跳出,使用goto还是比较方便的
比如:
#include <stdio.h>
int main()
{
for(....)
{
for(...)
{
for(...)
{
if()
goto n;
}
}
}
}
n:
...
for 循环想提前退出得使⽤ break ,⼀个 break 只能跳出⼀层 for 循环,所以在这种情况下我们使⽤ goto 语句就会更加的快捷。
文章有点长,非常感谢大家观看!!!
大家一起加油!!!