C语言中的分支和循环语句

本文详细介绍了C语言中的分支语句和循环语句。分支语句包括if语句和switch语句,阐述了其用法、匹配规则和优势。循环语句有while、for、do while和goto语句,说明了各语句的结构、条件判断、continue和break的作用,以及goto语句的跳跃功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分支语句

        分支语句,又叫选择语句,有两种,一种是 if 语句,另一种是 switch 语句,分支语句的功能很容易理解,就是做选择,从多个选项中做出选择。

if 语句

        先介绍if语句,if语句的完整形式如下

if (判断条件)
{
    ...
}
else if (判断条件)
{
    ...
}
else
{
    ...
}

在这个形式中,小括号中的内容是一些表达式,用于判断真假,(在C语言中 0 表示假,非 0 表示真,即使是使用 bool 类型,也只不过是把 0 写成了false,1 写成了 true,本质上仍是 0 表示假,非 0 表示真)如果条件为真,则执行大括号中的语句,如果条件为假,则不执行大括号中的语句。当然你也可以只用一个 if 或者是用一个 if + else,但是请注意,else 不能单独使用。并且这里有一个容易混淆的点,就是 else 与 哪一个 if 匹配的问题,请看下面的代码,判断一下 else 与哪一个 if 匹配。

if ()
    if ()
        printf("hello world")
else

        答案是与第二个 if 匹配,这是 else 与 if 的匹配规则,即 当有多个 if 时,且 if 与else 之间没有大括号相隔,则else 总是与离它最近的 if,你可以把它理解为 else 的就近原则。上面的代码如果你想让 else 与第一个 if 匹配则只需要加一对大括号,像下面这样。

if ()
{
    if ()
        printf("hello world");
}
else

        从这一点中,我们可以认识到,代码的可读性对于一个写程序的人来说是非常重要的,因为我们写的程序,大多数情况下是给别人看的,希望能看到这篇博文的你可以和我一起共同努力,养成一个良好的编程习惯,推荐一本书林锐博士《高质量c/c++编程指南》。        

        题外话说的有点多,言归正传,if、else if 和 else 中的判断条件是并行的,也就是说程序只能进入if、else if、else 中其中一个,去执行大括号中的语句,这一点很重要,这意味着你不能只通过一个if,然后if后面加上else if 或者 else 来实现多个覆盖条件的同时判定,具体可以看一下下面的例子

if (x < 10)
{
    printf("Z");

}
else if (x > 5)
{
    printf("H");
}

        在这个例子中,当你输入的 5 < x < 10 时,比如 x = 9,屏幕上只会打印出 Z ,而不会打印出 H ,而要想打印出 H ,则需要两个 if 语句的判断,如下:

if (x < 10)
{
    printf("Z");

}
if (x > 5)
{
    printf("H");
}

        当然,也有其他的方式,比如:将 if 语句中的条件设置成 x > 5 && x < 10,或者是,进行 if 语句的嵌套。但这并不是说多个 if 的判断很鸡肋,在有些时候,比如当你的条件过于复杂时,才分成多个 if 语句,可以是你的代码的逻辑更容易,被人理解。

        if 语句就说到这里,接下来进入 switch 语句的介绍。

switch 语句

        大多数初学者,最开始对于 switch 语句的看法是,这个语句好鸡肋啊。其实我也是这样,但是,在深入了解 switch 语句之后,你会发现 switch 语句,有一点是 if 语句赶不上的,那就是连续判定,符合条件就可以记录数据,这是 switch 语句的最大优势。举个例子,输入一个年月日计算出这一天是这一年的第几天,用 switch 语句可以很好的实现它,看代码:

//计算
	//闰年,2月29天 
	if ((year%100 != 0 && year%4 == 0) 
		 || (year%400 == 0))
	{
		//计算整月的天数 
		switch(month - 1)
		{
			case 12:
				ordinal = ordinal + 31;
			case 11:
				ordinal = ordinal + 30;
			case 10:
				ordinal = ordinal + 31;
			case  9:
				ordinal = ordinal + 30;
			case  8:
				ordinal = ordinal + 31;
			case  7:
				ordinal = ordinal + 31;
			case  6:
				ordinal = ordinal + 30;
			case  5:
				ordinal = ordinal + 31;
			case  4:
				ordinal = ordinal + 30;
			case  3:
				ordinal = ordinal + 31;
			case  2:
				ordinal = ordinal + 29;
			case  1:
				ordinal = ordinal + 31;
		}
		
		//计算不完整月的天数
		ordinal = ordinal + day;
		
	}

        好了,说了 switch 的优势后,仍然,进入 switch 语句的基础部分,它的完整形式,如下:

switch (整型表达式)
{
    case 整型常量表达式:
        {
            break;
        }
    case ... :

    default :
    {

    }

}

        这里我们先说一下“整型表达式”和“整型常量表达式”,整型表达式的运算包括加减乘除,以及取模,一定要注意,它不能是类似 pow() 函数,虽然好像是整型运算,但仔细看它的定义你会发现,它其实进行的是浮点运算,虽然有时候编译器不会报错,但也一定要注意,比如:

	int a = 2;
	switch (pow((double)a, 2.0))
	{
		case 4:
		{
			printf("Z");
			break;
		}
		default:
		{
			printf("H");
		}
	}

在屏幕上打印出来的是 H 而不是我们通过平常数学计算推出的,应该打印 Z 。然后再说一下,整形常量表达式,这个词语中有两个修饰词,“整型”,“常量”,在C中,它指的是整数(我们在数学上的整数)和字符(例如:a,b...),可能你会对它包含字符有些难以理解,这里可以简单的说一下,字符在计算机中的存储,是按照ASCII表上的整数一一对应进行存储的,也就是说字符在计算之中的形式就是一个数。说完这两点,其他的部分就很好理解了,一点一点说。

        switch 后面的(整型表达式)是判断对象,其对应 case 后面的(整形常量表达式)它是判断的结果,换句话说,整形常量表达式是整型表达式的结果,当结果对应执行 case 后面的语句,如果没有一个 case 的结果与其对应,则从 default (default是一个别无选择的选项,即,没有一个 case 的结果是整型表达式的答案)开始,执行后面的语句,这里一定要注意,我说的是执行后面的语句,这句话的意思是,在这个 case 或者是default 后面的语句将全部按顺序执行,直达遇到 break,你可以把 case 和 default 理解成一个门,开门后就一直走下去,直到遇到 break 或者是执行到 switch 的末尾。

        好了,switch 语句就到这里,我用的其实也不多,如果还有更好玩的点,我也会在之后的博客中补充,接下来轮到了循环语句。

 循环语句

        循环语句有四种类型,分别是,while,for,do while 以及 goto语句,接下来我将对它们进行介绍,这里就不采用介绍分支语句时逐一介绍了,主要是因为这些循环有很多的相似之处,逐一介绍的话感觉有些水....  

while 语句的完整结构如下

while (条件判断)
{
    
    continue;
    
    break;

}

do while 语句的完整结构

do
{

    continue;
    
    break;

} while(条件判断)

for 语句的结构

for ( 初始化 ; 判断  ;  循环 )
{
    
    continue;

    break;

}

//示例

for (i=0; i<10; i++)
{
    


}

        while 和 do while 的条件判断与 if 语句完全相同,这里就不再过多赘述,需要注意的是 for 循环中的判断部分,着重控制的是循环的次数,但想对于多组输入这样的判断条件 while 循环要比 for 循环好用,而 do while 循环与 while 循环,只存在一点不同,即do while 循环是先去执行一次循环体中的语句,再进行判断,判断在后,但 while 循环是先进行判断,如果为真,才能进入循环体,去执行语句。

        现在来说明 continue 和 break 在循环中的意义,它们在 while,for,do while 循环中的意义相同,只是在使用上有一些细节需要注意。我们先介绍上文中出现过的 break,在循环中 break 语句的功能是跳出循环,和switch 语句中的 break 跳出分支,有相通之处,这里也只略说一下,我们主要说 continue 的功能,在执行到 continue 语句时,会跳过 continue 后面的全部语句,重新进入循环,while 和 do while 就相当于再重新判断,但是使用 while 或 do while 进行循环次数的控制时,要小心跳过了 i++ 而使程序进入了死循环,但是如果使用的是 for 循环的则就不会有种担心,因为 continue 不会跳过 for 小括号中的 i++。

        哦,对于 for 循环还有一个要注意的点,就是 for 小括号中的初始部分,只会在第一次进入执行 for 时,进行初始。

        go to 语句的话,它不好单个演示,只能在程序中演示,并且它与其他循环语句相比,它具有一个极其独特的功能,跳跃,或许你现在还有些摸不着头脑,慢慢看下去,我们用一个示例来说明它跳跃的功能,示例如下

int main()
{

again :
    printf("Z");
    goto again;

    return 0;
}

首先说明一下,这是一个死循环。至于为什么,我们先来说明一下 goto 语句的组成,在示例中goto 其后的 again 只是一个标记名,你也可以命名成其他的名字,这个标记可以放到,主函数的任意位置,但不能跨源文件使用,当执行到 goto 语句时,程序执行的下一步将会跳到,标记处,往下继续执行,这就是 goto 独有的特点,这一点在跳出多重循环时,极为有效。

        以上就是本篇的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值