只要你愿意 开始总比放弃好。 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语句:
例题:
其输出结果是什么呢?
把代码放到VS2019运行如下:
注意看代码排版以及输出结果,此代码排版并非人为故意修改排版,而是系统自带排版效果;可以看到没有任何输出。
*说明如下:
else总是与其最近的if进行匹配;
if...else合在一起叫做一条语句,所以当 if 后面跟有 if...else语句,在即使不加 { } 的条件下,其效果就相当于加了 { }
---------------------------代码风格很重要,推荐书《高质量C/C++编程》
4、if书写形式的对比:
// 代码 1if ( condition ){return x ;}return y ;// 代码 2if ( condition ){return x ;}else{return y ;}*两种书写效果一样,但是一般采用第二种写法,比较明了注意第一种书写产生的效果 ,注意使用的是return!!
// 代码 3int num = 1 ;if ( num == 5 ){printf ( "hehe\n" );}// 代码 4int num = 1 ;if ( 5 == num ){printf ( "hehe\n" );}*两种效果一样,但是一般采用第二种写法,因为书写容易遗漏=,所以一般采用第二种写法,避免产生赋值的错误情况。变量不能赋值给常量!
![](https://i-blog.csdnimg.cn/blog_migrate/bc6fdc4b02fc7f10045f17f265c0a59c.png)
二)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运行嵌套使用:
实例:
//若是case后面没有break,看default会不会被执行--会
二、循环执行语句(循环结构)
一)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码表
-------------------------------------------------
缓冲区!
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 ;}
三)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 )// 处理错误情况