【C语言】一分钟带你了解 选择语句、循环的奥秘

在这里插入图片描述
欢迎来到我的博客!💃💃
🏡🏡博客主页:August_._一起持续学习,不断总结,共同进步🎊🎊



if 语句

1、复合语句

注意,在 if 语句中,语句是一条语句而不是多条语句:

if (表达式)语句

如果想用 if 语句处理两条或更多条语句,可以引入复合语句——由一对花括号,以及花括号内的声明和语句混合而成。通过在一组语句周围放置花括号,可以强制编译器将其作为一条语句来处理。

2、else 子句

if 语句可以有 else 子句:

if (表达式) 语句
else 语句

如果圆括号内的表达式的值为0,那么就执行 else 后边的语句。
下面是一个含有 else 子句的 if 语句的示例:

 if (i>j) max = i;
 else  max = j;

注意,两条"内部"语句都是以分号结尾的。
C 语言对可以出现在 if 语句内部的语句类型没有限制。可以在 if 语句内部嵌套其他 if 语句,例如:

 if (i > j)
 	if (i > k) max=i;
 	else max=k;
 else  	
 	if (j > k) max=j;
 	else max=k;

注意,把每个 else 同与它匹配的 if 对齐排列,这样做很容易辨别嵌套层次。如果发现嵌套仍然很混乱,那么可以为语句增加花括号(即使有时并不是必需的)。
使用花括号有两个好处

  • 很容易添加更多的语句到任何 if 或 else 子句中,程序变得更容易修改;
  • 在向 if 或 else 子句中增加语句时避免由于忘记使用花括号而导致错误。

3、级联式 if 语句

级联式 if 语句的书写形式:

if(表达式)
	语句
else if(表达式)
	语句
...
else if(表达式)
	语句
else 
	语句

编程时常常需要判定一系列的条件,一旦其中某一个条件为真就立刻停止。“级联式” if 语句常常是编写这类系列判定的最好方法。
例如,这个级联式 if 语句用来判定 n 是小于0、等于0,还是大于0:

 if (n<0)
 	printf(" 1\n ");
 else if (n==0)
 	printf(" 0\n ");
 else 
 	printf(" 2\n ");

当然,这种格式中的最后两行( else 语句)不是总出现的,这种缩进级联式 if 语句的方法避免了判定数量过多时过度缩进的问题。

4、“悬空else”的问题

当 if 语句嵌套时,千万要当心著名的"悬空 else "的问题。思考下面这个例子:

 if (y!=0)
	 if (x!=0)
		 result = x / y;
 else 
	 printf (" 0\n ");

C 语言遵循的规则是 else 子句应该属于离它最近的且还未和其他 else 匹配的 if 语句。在此例中, else 子句实际上属于最内层的 if 语句,因此正确的缩进格式应该如下所示:

 if (y!=0)
	 if (x!=0)
		 result = x / y;
	 else 
		 printf (" 0 \n ");

为了使 else 子句属于外层的 if 语句,可以把内层的 if 语句用花括号括起来:

 if (y!=0){
 	if (x!=0)
 		result = x / y;
) 
else 
 	printf (" 0 \n ");

5、条件表达式

C 语言提供了一种特殊的运算符,允许表达式依据条件的值产生两个值中的一个。

表达式1? 表达式2:表达式3
//如果表达式1成立,那么表达式2,否则表达式3

表达式1、表达式2和表达式3可以是任何类型的表达式,这是 C 运算符中唯一 一个要求3个操作数的运算符。因此,它通常被称为三元( ternary )运算符。
条件表达式求值的步骤如下:

  1. 计算出表达式1的值
  2. 如果此值不为零,那么计算表达式2的值,并且计算出来的值就是整个条件表达式的值
  3. 如果表达式1的值为零,那么表达式3的值是整个条件表达式的值

下面的示例对条件运算符进行了演示:

 int i=1, j=2, k;
 k = i>j? i:j;    // k=2
 k = ( i>=0? i:0) + j;    // k=3

这里一定要加上括号,因为除赋值运算符以外,条件运算符的优先级低于其他运算符。

条件表达式也普遍用于某些类型的宏定义中, printf 函数的调用有时也会得益于条件表达式,例如:

 if ( i > j )
 	printf ("%d \n ", i );
 else 
 	printf ("%d \n ", j );
// 可以简化为
 printf ("%d \n ", i > j ? i : j );

switch 语句

在日常编程中,常常需要把表达式和一系列值进行比较,从中找出当前匹配的值。因此,C语言提供了等价于级联式 if 语句的switch语句。
最常用的格式如下:

switch (表达式){
case 常量表达式:语句

case 常量表达式:语句
default:语句
}

注意:

  • C 语言把字符当成整数来处理,因此在 switch 语句中可以对字符进行判定。但是,这不适用于浮点数和字符串
  • 常量表达式不能包含变量和函数调用。因此, n +10不是常量表达式(除非 n 是表示常量的宏)
  • 分支标号中常量表达式的值必须是整数(字符也可以),后边可以跟任意数量的语句,并且不需要用花括号把这些语句括起来
  • 每个分支标号的,每组语句的最后一条通常是 break 语句
 switch (grade) {	
	 case 0:
		 printf (" 0 ");
		 break ;
	 case 1:
		 printf (" 1 ");
		 break ;
	 case 2:
		 printf (" 2 ");
		 break ;
	 case 3:
 		 printf (" 3 ");
 	  	 break ;
	 case 4:
	     printf (" 4 ");
 		 break ;
	 default :
		 printf (" 5 ");
		 break ;
}

C 语言不允许有重复的分支标号,但对分支的顺序没有要求,特别是 default 分支不一定要放置在最后。
case 后边只可以跟随一个常量表达式。但是,多个分支标号可以放置在同一组语句的前面:

 switch (grade){
 	case 4: case 3: case 2: case 1:
		 printf (" 1 ");
		 break ;
	case 0:
 		printf (" 0 ");
 		break ;
 	default:
 		printf (" 5 ");
 		break ;
 }

switch 语句不要求一定有 default 分支。如果 default 不存在,而且控制表达式的值和
任何一个分支标号都不匹配的话,控制会直接传给 switch 语句后面的语句。

while 语句

while 语句的格式如下所示:

while (表达式)语句

执行 while 语句时,先判定控制表达式,再执行循环体会持续进行,直到控制表达式的值变为零才停止。例如:

 i = 1;
 while ( i < n )
 	i = i * 2;

注意,只有在控制表达式 i < n 为真的情况下循环才会继续。当表达式值为假时,循环终止,并且此时 i 的值是大于或等于 n 的。

无限循环

如果控制表达式的值始终非零, while 语句将无法终止。因此可以用非零常量作为控制表达式来构造无限循环:

while (1) …

除非循环体中含有跳出循环控制的语句( break 、 goto 、 return )或者调用了导致程序终止的函数,否则上述形式的 while 语句将永远执行下去。

do 语句

事实上, do 语句本质上就是 while 语句,只不过其控制表达式是在每次执行完循环体之后进行判定的。
格式如下所示:

do {	
	语句
} while(表达式);

do 语句的循环体必须是一条语句(也可以用复合语句),并且控制表达式的外面也必须有圆括号。执行 do 语句时

  1. 先执行循环体,再计算控制表达式的值
  2. 如果表达式的值是非零的,再次执行循环体,然后再次计算表达式的值
  3. 在循环体执行后,若控制表达式的值变为0,则终止 do 语句的执行。

for 语句

1、语法

格式如下所示:

for (声明或者表达式1;表达式2;表达式3)语句

例如:

for (i=10; i>0; i--)
	printf (" It's %d \n ", i );

实上,除了一些极少数的情况以外, for 循环总可以用等价的 while 循环替换:

表达式1;
while(表达式2) {
	语句
	表达式3;
}
  • 表达式1是循环开始执行前的初始化步骤,只执行一次;
  • 表达式2用来控制循环的终止(只要表达式2的值不为零,循环就会持续执行);
  • 表达式3是每次循环中最后被执行的一个操作

研究等价的 while 语句有助于更好地理解 for 语句。例如,假设把先前的 for 循环示例中的 i - -替换为 - - i :

for ( i=10; i>0; --i )
	printf (" It's %d \n ", i );

这样做会对循环产生影响呢?研究等价的 while 循环就会发现,这对循环没有任何影响:

 i = 10;
 while ( i > 0){
 	printf (" It's %d \n ", i );
	--i;
}

2、在 for 语句中省略表达式

通常 for 语句用三个表达式控制循环,但是有一些 for 循环可能可以省略任意或全部的表达式。

注意:
即使省略掉某些表达式,控制表达式也必须始终有两个分号

如果省略了 for 语句中的第三个表达式,循环体需要确保第二个表达式的值最终会变为假。
当 for 语句同时省略掉第一个和第三个表达式时,它和 while 语句没有任何分别。例如,

for (; i>0; )
	printf (" It's %d \n ",i--); 
//等价于
while (i>0)
	printf (" It's %d \n ",i--); 

这里 while 语句的形式更清楚,因此也更可取。
如果省略第二个表达式,那么它默认为真值,因此 for 语句不会终止(除非以某种其他形式停止)。例如,可以用下列 for 语句建立无限循环

 for ( ; ; ) ...

3、逗号运算符

格式如下所示:

表达式1,表达式2

这里的表达式1和表达式2是两个任意的表达式。计算主要通过两步来实现:

  1. 计算表达式1并且扔掉计算出的值;
  2. 计算表达式2,把这个值作为整个表达式的值

逗号运算符的优先级低于所有其他运算符,所以不需要在++ i 和 i + j 外面加圆括号。
逗号运算符允许将两个表达式"粘贴"在一起构成一个表达式。其中 for 语句是唯一可以发现逗号运算符的地方。例如,假设在进入 for 语句时希望初始化两个变量:

 sum = 0;
 for (i=1; i <= N ; i++)
 	sum += i ;
//改写为
 for (sum=0, i=1; i <= N ; i++)
 	sum += i ;

表达式 sum =0, i =1首先把0赋值给 sum ,然后把1赋值给 i 。利用附加的逗号运算符, for 语句可以初始化更多的变量。

退出循环

1、break语句

break 语句把程序控制从包含该语句的最内层 while 、 do 、 for 或 switch 语句中转移出来。因此,当这些语句出现嵌套时, break 语句只能跳出一层嵌套
例如: switch 语句嵌在 while 语句中的情况

 while (...){
 	switch (...){
		...
 		break ;
 		...
 	}
 }

break 语句可以把程序控制从 switch 语句中转移出来,但是不能跳出 while 循环。

2、continue 语句

continue 语句会把程序控制留在循环内,并且continue 语句只能用于循环
例如:无论何时读入数0都执行 continue 语句,控制将跳过循环体的剩余部分,但仍留在循环内。

 n = 0;
 sum = 0;
 while (n<10){
 	scanf ("%d",&i);
 	if (i==0) continue ;
 	sum += i ;
 	n++;
 }

3、goto 语句

goto 语句可以跳转到函数中任何有标号的语句处。
【C99增加了一条限制: goto 语句不可以用于绕过变长数组的声明】
标号只是放置在语句开始处的标识符:

标识符:语句

goto 语句的格式如下:

goto 标识符;

语句必须和 goto 语句在同一个函数中。

  • 44
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值