C语言由基础至精通——分支与循环

C语言是一门结构化的程序设计语言,包含了顺序选择循环三种基本控制结构。在C语言中,所有代码都离不开这三种结构,它可以由一种或多种基本控制结构组成

一、三种基本控制结构

C语言支持三种基本控制结构:顺序结构、选择结构、循环结构。

基本控制结构 概念
顺序结构 语句自上而下顺序执行,执行完上一个语句,无条件的执行下一个语句
选择(分支)结构 通过某个给定条件进行判断,条件为真或假时分别执行不同的程序内容(ifswitch
循环结构 当条件为真时反复执行,直到条件为假则跳出循环(forwhiledo 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

四、选择(分支)结构

(1)if 语句

语法:

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;
}

(2)if …else…语句

语法:

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");
    }
    

(3)嵌套if语句

在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;
}

(4)悬空else问题

对于多个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;    
}

(5)switch语句

除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;
}

注:

  • switch 后的变量表达式必须是整型表达式
  • case 后的值,必须是整形常量表达式
  • case 和后边的数字之间必须有空格
  • 每⼀个case 语句中的代码执行完成后,需要加上break ,才能跳出这个switch语句;若无break语句,则程序会继续往下执行,直到遇到break语句才会结束执行,跳出switch语句
  • case 语句与default 语句没有顺序要求,表达式值与case 值对应时,执行case下的语句;若无对应值,则执行default下的语句

五、循环结构

C语⾔提供了3种循环语句,while、for、do…while。

(1)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;
}

(2)for 循环

语法:

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")    // 无退出语句时,程序死循环
}

(3)do…while 循环

语法:

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;
}

(4)break 语句

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;
}

(5)continue 语句

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;
}

(6)goto 语句

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

你可能感兴趣的:(C语言,c语言,算法,c++)