C语言是一门结构化的程序设计语言,包含了顺序、选择和循环三种基本控制结构。在C语言中,所有代码都离不开这三种结构,它可以由一种或多种基本控制结构组成。
C语言支持三种基本控制结构:顺序结构、选择结构、循环结构。
基本控制结构 | 概念 |
---|---|
顺序结构 | 语句自上而下顺序执行,执行完上一个语句,无条件的执行下一个语句 |
选择(分支)结构 | 通过某个给定条件进行判断,条件为真或假时分别执行不同的程序内容(if、switch) |
循环结构 | 当条件为真时反复执行,直到条件为假则跳出循环(for、while、do while) |
C语言中用于比较的式子称为“关系表达式”,所用到的操作符(运算符)称为“关系运算符”。
关系运算符 | 含义 | 说明 | 实例 | 结果 | 返回值 |
---|---|---|---|---|---|
> | 大于运算符 | 只支持左右两边操作数是数值类型 | 3>1 | true | 1 |
< | 小于运算符 | 只支持左右两边操作数是数值类型 | 3<1 | false | 0 |
>= | 大于等于运算符 | 只支持左右两边操作数是数值类型 | 3>=1 | true | 1 |
<= | 小于等于运算符 | 只支持左右两边操作数是数值类型 | 3<=1 | false | 0 |
== | 相等运算符 | 支持非数值类型数据比较 | 3==1 | false | 0 |
!= | 不相等运算符 | 支持非数值类型数据比较 | 3!=1 | true | 1 |
在C语言中,关系表达式通常返回0或1,0 表示假,所有非零值表示真。例如,3>1返回1 ,1>3 返回0。
注:
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int age = 0;
scanf("%d", &age);
if(18<=age<=36) // 关系运算符连用时从左往右计算
printf("⻘年\n");
else
printf("非⻘年\n");
return 0;
}
在这段代码,18<=age<=36,当输入的age=50时,连用关系运算符会从左到右计算,即先判断18<=50,返回值为1,接着用1与36比较,1<=36,为真,返回值为1,最后输出打印“青年”。显然,这段代码是存在问题的,解决办法:
if(age>=18 && age<=36) // 通过 && 符号分开两个关系运算,表示并且的意思
C语言中,逻辑运算符(操作符)提供逻辑判断功能,⽤于构建更复杂的表达式。
逻辑运算符 | 描述 | 实例 | 结果 |
---|---|---|---|
&& | 与运算,两侧的表达式都为真,则为真,否则为假 | 2>1 && 3>1 | true |
II | 或运算,两侧⾄少有⼀个表达式为真,则为真,否则为假 | 2>1 II 3<1 | true |
! | 逻辑取反运算,改变单个表达式的真假 | !1 | false |
语法:
if (表达式)
语句
表达式成立(为真),则语句执⾏;表达式不成立(为假),则语句不执⾏。注:在C语言中,0表示假,非0值表示真,即表达式结果为0时(假),语句不执行;表达式结果不为0时,语句执行。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
// 输入⼀个整数,判断是否为奇数
int a = 0;
scanf("%d", &a);
if (a % 2 == 1) // 为真,打印;为假,不打印
printf("%d 是奇数\n",a);
return 0;
}
语法:
if (表达式)
语句1
else
语句2
若表达式为真(非0),则执行语句1;表达式为假(0),则执行语句2。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
// 输入一个年龄,>=18岁就输出:已成年;否则就输出:未成年
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("已成年\n"); // 表达式为真,执行该语句
else
printf("未成年\n"); // 表达式为假,执行该语句
return 0;
}
注:在if 和else 语句中默认都只控制⼀条语句,若要同时控制多条语句,则可用 { } 括起来,如:
if (age >= 18) // 表达式为真,依次执行if大括号内所有语句
{
printf("已成年\n");
printf("你可以谈恋爱了喔\n");
}
else // 表达式为假,依次执行else大括号内所有语句
{
printf("未成年\n");
printf("你还不可以谈恋爱喔\n");
}
在if…else… 语句中,else 可以与另⼀个if 语句连用,构成多重判断。两种常用方式如:
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
// 要求输入⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出不是正数
// 第一种方式
int num = 0;
scanf("%d", &num);
if (num > 0) // 表达式为真,依次执行if大括号内所有语句
{
// 此处嵌套一个if..else..语句
if(num % 2 == 1)
printf("%d 是奇数\n",num);
else
printf("%d 是偶数\n", num);
}
else // 表达式为假,依次执行else大括号内所有语句
{
printf("%d 不是正数\n", num);
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
// 要求输入⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出不是正数
// 第二种方式
int num = 0;
scanf("%d", &num);
if (num < 0)
printf("%d 不是正数\n", num);
else if (num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
对于多个if 和else ,else 总是跟最接近的 if 匹配。如:
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n"); // 该else与第二个if,即最靠近的这个if匹配,故输出结果为 空
return 0;
}
这与我们写的代码的规范性有关,编译器从上到下依次编译时,会将else语句与最靠近它的if语句匹配,所以在写代码时,最好通过缩进或用 { } 大括号的形式,提高代码的可读性。如:
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1) // 表达式为真时,才执行if下大括号里的语句;此时为假,故输出结果:空
{
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
除if语句外,C语⾔还提供了switch语句来实现选择(分支)结构,常用于判断条件有多个结果的情况。
语法:
switch (变量表达式) {
case 常量1: 语句;break;
case 常量2: 语句;break;
default: 语句;break;
}
程序根据变量表达式的不同值,执行相应的case分支下的语句;若无case对应的值,则执行default分支下的语句。如:
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0: // n%3 表达式值为 0 时执行
printf("整除,余数为0\n");
break;
case 1: // n%3 表达式值为 1 时执行
printf("余数是1\n");
break;
case 2: // n%3 表达式值为 2 时执行
printf("余数是2\n");
break; // 执行结束,跳出switch语句
default:
printf("未知错误\n");
break;
}
return 0;
}
注:
C语⾔提供了3种循环语句,while、for、do…while。
语法:
while(判断表达式)
循环语句; // 如果循环体想包含更多的语句,可以加上⼤括号
循环过程:程序先执行判断表达式,若表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。
#include
int main()
{
// 打印1~10,输出至屏幕上
int i = 1; // 初始化变量 i
while(i<=10) // 判断条件
{
printf("%d ", i); // 循环打印1~10,直到i不再满足循环条件
i = i+1; // 调整变量 i
}
return 0;
}
语法:
for(表达式1; 表达式2; 表达式3)
循环语句; // 如果循环体想包含更多的语句,可以加上⼤括号
表达式1,用于循环变量的初始化;表达式2,用于循环结束条件的判断;表达式3,用于循环变量的调整。
循环过程:程序先执行表达式1,初始化循环变量,再执行表达式2 的判断部分,若表达式2 的结果==0,则循环结束;若表达式2 的结果!=0,则执行循环语句,循环语句执行完后,再执行表达式3 ,调整循环变量,然后再去表达式2 的地方执行判断,根据表达式2 的结果是否为0,决定循环是否继续。
整个循环过程中,表达式1只执行一次,表达式2和表达式3循环多次。
#include
int main()
{
// 打印1~10,输出至屏幕上
int i = 0;
for(i=1; i<=10; i++) // 初始化循环变量、条件判断、调整变量
{
printf("%d ", i);
}
return 0;
}
注:for语句中的表达式1、2、3均可以省略,即为空语句,没有条件的循环,若for里面没有退出语句,则程序会发生死循环。
for( ; ; ) // 空语句,无条件循环
{
printf("haha\n") // 无退出语句时,程序死循环
}
语法:
do
循环语句;
while(判断表达式);
while 和for 这两种循环都是先判断,如果条件满足就进⼊循环,执行循环语句,如果不满足就跳
出循环;而do while 循环则是先进入循环体,执行循环语句,然后再执行while 后的判断表达式,若表达式为真,则进入下一次循环;若表达式为假,则结束循环。
循环流程:程序先执行do下面的语句,再执行判断表达式,若表达式结果!=0,则继续循环,执行do下面的语句;若表达式结果==0,则结束循环。
整个循环过程中,循环体至少执行一次。
#include
int main()
{
// 打印1~10,输出至屏幕上
int i = 1;
do
{
printf("%d ", i); // 先执行该语句
i = i + 1;
}while(i<=10); // 后进行条件判断
return 0;
}
break 语句, 用于永久的终止循环,只要break 语句被执行,程序就会直接跳出循环,往后执行整个循环体外的语句。
#include
int main()
{
// 打印1~10,输出至屏幕上
int i = 1;
while(i<=10) // 输出结果:1 2 3 4
{
if(i == 5)
break; // 当i等于5后,就执⾏break 语句,循环终⽌
printf("%d ", i);
i = i+1;
}
return 0;
}
continue 语句,用于跳过本次循环continue 后边的代码,继续进行下⼀次循环的判断。
while 循环中的continue:
#include
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
//当i等于5后,就执⾏continue 语句,直接跳过continue的代码,去循环的判断的地⽅
//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊死循环
printf("%d ", i);
i = i+1;
}
return 0;
}
for 循环中的continue:
#include
int main()
{
int i = 1;
for(i=1; i<=10; i++) // 输出结果:1 2 3 4 6 7 8 9 10
{
if(i == 5)
continue; //这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
goto 语句是C语言中的一个控制流语句,它允许程序直接跳转到一个特定的标签。然而,由于goto语句可能会导致程序的流程变得难以理解和维护,因此许多现代编程风格指南都建议避免使用goto语句。
#include
int main()
{
printf("hehe\n");
goto next: // 程序执行到这里时,会跳转到next标签处,继续往下执行
printf("haha\n");
next: // 标签
printf("跳过了haha的打印\n");
return 0;
}
一、输入⼀个人的年龄,如果年龄<18岁,打印"少年";如果年龄在18岁⾄44岁,打印"⻘年";如果年龄在45岁⾄59岁,打印"中⽼年";如果年龄在60岁⾄89岁,打印"⽼年";如果90岁以上,打印"老寿星"。
二、输⼊⼀个年份year,判断year是否是闰年。
三、输⼊⼀个1~7的数字,打印对应的星期几。
四、输⼊⼀个正的整数,逆序打印这个整数的每⼀位。
五、计算1~100之间3的倍数的数字之和。
六、输⼊⼀个正整数,计算这个整数是几位数。
七、找出100~200之间的素数,并打印在屏幕上。
参考代码:https://gitee.com/zuiltd/c-language/commit/b2f70646d4a8ebe4b8bb73cf09ad57eb46f0316c