分支和循环语句(含goto语句)-Part1

只要你愿意 开始总比放弃好。     Roman.

愿我们都有自己的目标并正在为其不懈努力。

----------------------------------------------------分割线

C语言是【结构化】的程序语言,其结构化体现在:顺序结构、选择结构(if语句、switch语句)、循环结构(for语句、while语句、do...while语句)

-------------------------------------------------------

语句的分类:

语句:C语言中由一个分号;分隔开的就是一条语句。

①表达式语句:表达式 + ;

②函数调用语句:函数 + ()

③控制语句:控制程序执行流程,以实现程序各种结构方式。其包含:条件判断语句,也叫分支语句(if语句、switch语句);循环执行语句(while语句、for语句、do...while语句);转向语句(goto语句、break语句、continue语句、return语句)

④复合语句

⑤空语句

-------------------------------------------------------

一、条件判断语句,也叫分支语句(即选择结构)

 一)if语句

 1、语法结构:

(表达式为真则执行,不为真则执行下一条)

//单分支

if(表达式)

  语句;

//双分支

if(表达式)

  语句1;

else

  语句2;

//多分支

if(表达式1)

  语句1;

else if(表达式2)

  语句2;

...

else

  语句n;

注意回顾:表达式真假判断依据 (0为假,非0为真)

 2、注意点:

if 、else if 、 else 语句默认执行一条语句,若想要执行多条语句,则需要使用{ }

书写习惯:一般都使用{ }

注:一个{ }就是一个代码块

3、悬空else语句:

例题:

分支和循环语句(含goto语句)-Part1

其输出结果是什么呢?

把代码放到VS2019运行如下:

分支和循环语句(含goto语句)-Part1

注意看代码排版以及输出结果,此代码排版并非人为故意修改排版,而是系统自带排版效果;可以看到没有任何输出。

*说明如下:

else总是与其最近的if进行匹配;

if...else合在一起叫做一条语句,所以当 if 后面跟有 if...else语句,在即使不加 {  } 的条件下,其效果就相当于加了 {  }

---------------------------代码风格很重要,推荐书《高质量C/C++编程》

 4、if书写形式的对比:

// 代码 1 if ( condition ) {     return x ; } return y ; // 代码 2 if ( condition ) {     return x ; } else {     return y ; } *两种书写效果一样,但是一般采用第二种写法,比较明了 注意第一种书写产生的效果 ,注意使用的是return!!
// 代码 3 int num = 1 ; if ( num == 5 ) {     printf ( "hehe\n" ); } // 代码 4 int num = 1 ; if ( 5 == num ) {     printf ( "hehe\n" ); } *两种效果一样,但是一般采用第二种写法,因为书写容易遗漏=,所以一般采用第二种写法,避免产生赋值的错误情况。变量不能赋值给常量!
 5、练习 1. 判断一个数是否为奇数 ---------------------------------------------以下是一种解答方式: 分支和循环语句(含goto语句)-Part1 2. 输出 1-100 之间的奇数 -------------------------------------------以下是一种解答方式:

 分支和循环语句(含goto语句)-Part1

二)switch语句:常用于多分支情况

 1、语法结构

switch(整型表达式)

{

    语句项;

}

语句项:是一些case语句,形式:

case 整形常量表达式:

  语句;

  break;

2、注意:

1) switch(表达式)中的表达式只是决定了case 的入口,若是没有出口限制(break进行限制),就会一直往下执行,直至结束;

如果只想执行某一个case语句,需要break;作为出口(跳出语句)

2)具有相同的输出,则多个case  :接一个语句即可

3)即使是最后一个case 也不建议省略 break;语句

3、default:

所有case 语句都不可以被匹配执行,则执行该语句,并且同样需要使用 break;

其放置顺序位置不影响输出结果,但是习惯默认放置于最后

default不是必须选项,但是建议使用

4、switch运行嵌套使用:

 实例:

分支和循环语句(含goto语句)-Part1

//若是case后面没有break,看default会不会被执行--会

 分支和循环语句(含goto语句)-Part1

二、循环执行语句(循环结构)

一)while语句

1、语法结构:

while(表达式)

  循环语句;

(表达式为真才进入)

2、break;  跳出这个循环,提前终止整个循环。即:break在while语句中是永久终止循环的!

3.continue; 跳出当前循环,进入下一次循环,即:直接跳到while语句的判断部分

 一旦遇到continue,后面的语句不被执行!

4、注意补充:

getchar( ); 读取字符,返回类型是int,读取错误或者读取到结束文件则返回EOF(定义为-1);但是注意:最后打印结果是所输入的字符

putchar( );打印字符

摁 ctrl + z 会停止,其本质是 ctrl + z 会让 getchar 或 scanf 返回 EOF ,但是VS编译环境下可能出现摁一下无法停止的情况,这是VS本身的bug

5、实例:

1、确认密码分析

//确认密码分析
#include<stdio.h>
int main()
{
	char password[20] = { 0 };
	printf("请输入密码:\n");
	scanf("%s", password);
	int tmp = 0;
	while ((tmp = getchar()) != '\n')
	{
		;//作用是:清除掉缓冲区中的所有'\n'
	}
	printf("请确认密码(Y/N):\n");
	int ch = getchar();
	//if (strcmp(ch, 'Y') == 0)//错误,此时ch 是int类型,并不是字符,所以直接比较就好
	if(ch == 'Y') 
	{
		printf("确认成功!\n");
	}
	else
	{
		printf("确认失败!\n");
	}

	return 0;
}

2、分析以下代码:

#include<stdio.h>
int main()
{
	char ch = '\0';
	while ((ch = getchar()) != EOF)
	{
		if (ch < '0' || ch>'9')
			continue;
		//意义:若ch的ASCII码值在0-9之间,则跳过continue输出ch
		//由ASCII码表知:<'0' or >'9'是其他字符,而'0'--'9'之间是数字字符
		putchar(ch);
	}
	return 0;
}

附上ASCII码表

分支和循环语句(含goto语句)-Part1

-------------------------------------------------

缓冲区!

scanf("%s")只读取空格之前的字符串!!

while{  ;} 是空语句

getchar( );工作一次,缓冲区就少一个字符!!

注意类型是 int

二)for语句

1、语法结构:

for(表达式1;表达式2;表达式3)

  循环语句;

(表达式1:初始化;  表达式2:条件判断;  表达式3:调整部分)

2、比较while循环和for循环的区别:

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
 printf("hehe\n");
 i = i+1;//调整部分
}

//实现相同的功能,使用for
for(i=1; i<=10; i++) {
 printf("hehe\n");
}

3、注意:

  •  在for循环中同样有break 和 continue
  • 初始化、判断、调整均可省略,此时陷入死循环:for循环的判断部分省略了,就以为着判断恒为真

4、建议:

  •  不可在for循环体内修改循环变量,防止for循环失去控制
  •  建议for语句的循环控制变量的取值采用“前闭后开”写法(即:判断处用小于<形式)--此种写法让循环次数比较明确,但是不要呆板,可以灵活改变。eg:100-200就用闭区间

5、实例:

// 请问循环要循环多少次? #include <stdio.h> int main () {   int i = 0 ;   int k = 0 ;   for ( i = 0 , k = 0 ; k = 0 ; i ++ , k ++ )         k ++ ;   return 0 ; }
要注意:只有判断部分为真才会进入循环 所以:该代码判断部分为:k=0;即将0赋值给k,0为假,故不进入循环,循环0次。

三)do...while循环

 1、语法结构:

do

  循环体;

while(表达式);

2、注意:

  • 循环体至少被执行一次
  • 循环体里面的break同样是跳出整个循环
  • 循环体里面的continue结束当前循环,其后面的语句均被跳过

三、goto语句

1、goto语句可以随意滥用,但是理论上没有必要使用

2、有任意跳转作用,但是不可以跨函数跳转

3、最常见的用法:终止程序在某些深层嵌套结构的处理过程(如:一次跳出两层or多层循环)

4、注意:goto语句跳转时,是跳转之后的所有语句,不用{ }结果一样

5、适用场景(举例):

for (...)     for (...)   {         for (...)       {             if ( disaster )                 goto error ;       }   }     … error : if ( disaster )         // 处理错误情况
一个人所有的愤怒都是来源于自己无能的痛苦。  加油向前! ************************************一些练习与实例见下个博客
上一篇:acwing 语法基础课 python/c++ 代码 week3 循环语句


下一篇:leetcode34_排序数组第一个和最后一个