写在前面:
- 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。
- 除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注(未被标注出的部分可能全是重点,可根据相关部分的示例代码量和注释量判断,或者根据实际经验判断)。
- 如有错漏欢迎指出。
参考教程:C语言程序设计从入门到进阶【比特鹏哥c语言2024完整版视频教程】(c语言基础入门c语言软件安装C语言指针c语言考研C语言专升本C语言期末计算机二级C语言c语言_哔哩哔哩_bilibili
一、if语句
1、单行if语句
(1)形式:
if(条件)
{
条件满足执行的语句
}
(2)程序执行流程:首先判断if后面括号内的条件,如果为真则执行其下语句块内的语句,如果为假则直接跳过,执行if语句后面的语句。(对于括号内的条件,只要其中的表达式的值不为0即为真,为0即为假)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 20;
//单分支
if (age < 18)
{
printf("未成年\n");
//如果分支只有一条语句,可以不加大括号,但是为了结构清晰,建议每个分支都加上大括号
}
return 0;
}
2、多行格式if语句
(1)形式:
if(条件)
{
条件满足执行的语句
}
else
{
条件不满足执行的语句
}
(2)程序执行流程:首先判断if后面括号内的条件,如果为真则执行其下语句块内的语句,如果为假则执行else下语句块内的语句,接着不管条件是否为真,都继续执行if语句后面的语句。(对于括号内的条件,只要其中的表达式的值不为0即为真,为0即为假)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 20;
//双分支
if (age < 18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
return 0;
}
3、多条件的if语句
(1)形式:
if(条件1)
{
条件1满足执行的语句
}
else if(条件2)
{
条件2满足执行的语句
}
...
else
{
都不满足执行的语句
}
(2)程序执行流程:首先判断第一个if后面括号内的条件,如果为真则执行其下语句块内的语句,如果为假则判断第二个if后面括号内的条件,如果为真则执行其下语句块内的语句,如果为假则继续往下判断,以此类推,如果所有条件都不满足,则执行最后一个else下语句块内的语句,接着不管条件是否为真,都继续执行if语句后面的语句。(对于括号内的条件,只要其中的表达式的值不为0即为真,为0即为假)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int age = 20;
//多分支
if (age < 18)
{
printf("未成年\n");
}
else if (age >= 18 && age <= 30)
{
printf("18-30岁\n");
}
else
{
printf("大于三十岁\n");
}
return 0;
}
4、需要注意的问题——悬空else
(1)C语言中没有缩进的概念,在书写代码时添加缩进基本上都是为了提高代码的可读性,真正影响程序结构的,花括号算是其中一个因素,在if语句中,通常用花括号来使if的嵌套结构更清晰,而在没有加大括号的情况下,else是和离它最近的if匹配的,这样很容易产生难以发现的错误。
(2)不良示例:
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
(3)良好示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else //在没有加大括号的情况下,else是和离它最近的if匹配的
{
printf("haha\n");
}
//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
return 0;
}
二、switch语句
1、switch语句的形式
switch语句又称为开关语句,它也是一种选择语句,根据给定表达式的不同取值来决定从多个语句序列中选择哪一个开始执行,其语法格式如下:
switch(表达式)
{
case 结果1:执行语句; break;
case 结果2:执行语句; break;
...
case 结果n:执行语句; break;
default:执行语句; break; //最后这个break可有可无
}
(1)switch、case和default都是关键字。
(2)表达式的值必须属于整型、字符型或枚举型。
(3)每个case后跟着的结果是取值互不相同的整型常量、字符常量或枚举常量,其具体类型应与switch后面的表达式的值一致。
2、switch语句的执行过程
(1)首先计算出switch后面的表达式的值,设此值为E。
(2)case后面跟着的结果如果是表达式,先计算出它们的值,设它们分别为、、…、。
(3)将E依次与、、…、进行比较,如果E与某个值相等,则从该值所在的case标号语句开始执行各个语句序列,直至遇到break语句(在不出现break语句的情况下,将一直执行到switch语句结束)。
(4)如果E与所有值都不相等且存在default标号,则从default标号语句起开始向下执行,在不出现跳转语句的情况下,一直执行到switch语句结束。
(5)如果E与所有值都不相等且不存在default标号,则switch语句不会执行任何操作。
3、举例
(1)一种情况对应一种结果:
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
(2)多种情况对应一个结果:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
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;
}
(3)switch嵌套的情况:
#define _CRT_SECURE_NO_WARNINGS 1
#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); //m=5,n=3
return 0;
}
三、条件运算符和条件表达式
1、相关语法
(1)条件运算是C语言中唯一的三目运算,与其对应的运算符“?:”称为条件运算符,条件运算符的使用格式为:
<表达式1> ? <表达式2> : <表达式3>
(2)当计算由条件运算符构成的表达式时,首先计算<表达式1>,若<表达式1>的值非0,则计算出<表达式2>的值,并用这个值作为整个表达式的值;若<表达式1>的值为0,则计算出<表达式3>的值,并用这个值作为整个表达式的值。
2、举例
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0, b = 0;
b = (a > 5) ? 3 : -3; //等效于(a > 5) ? (b = 3) : (b = -3)
/*上面的条件表达式等效于下面的if语句
if (a > 5)
b = 3;
else
b = -3;
*/
return 0;
}