<一>分支语句
//if语句
- if-else语句的语法结构:
//类型1:
if(表达式)
语句1
//类型2:
if(表达式)
语句1
else
语句2
//类型3
if(表达式)
语句1
else if(表达式)
语句2
else
语句3
- 悬空else:else与最近的if匹配
int main()
{
int a = 0;
int b = 0;
if(a==1)
if(b==2)
printf("hehe");
else
printf("haha\n");
return 0;
}
以上程序最终没有输出,C语言不按照缩进进行匹配,此时的else是与if(b==2)进行匹配
如果要进行if-else的合理匹配,良好的代码风格是每个if-else之后加上一个代码块{},以便进行分割
- if书写形式的对比:
//代码1
if(condition)
{
return x;
}
return y;
//代码2
if(conditon)
{
return x;
}
else
{
return y;
}
//代码3
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
//代码4
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
在以上的代码中:代码1和2中,虽然两者都能运行同样的功能,代码2运用了代码块运用了代码块,层次更清晰;代码3和代码4中,有很多人将代码块的判断条件的等于号写成赋值符,如果按照代码三的运行方式,可能程序没有出现bug,代码依旧运行出错误的结果,难以找寻,但是代码4的存在可以便于我们发现代码出现错误情况.如果只是写上一个等号,那么此时便成为变量赋给常量,系统必定报错,我们也能够发现问题,而避免错误的程序运行出错误的结果.
注:if-else后如果不加大括号,默认执行其后的第一条语句.
switch语句
- switch语句结构:
switch(整形表达式)
{
//语句项;
}
switch后必须为整形常量(const int a = 10,a为整形常变量也不可以)
- switch语句和case,break和default的搭配:
//代码1
switch(day)
{
case 1:
printf(.....);
case 2:
printf(.....);
.....:
case 7:
printf(.....);
}
//代码2
switch(day)
{
case 1:
printf(.....);
break;
case 2:
printf(.....);
break;
.....:
case 7:
printf(.....);
break;
}
//代码3
switch(day)
{
case 1:
printf(.....);
break;
case 2:
printf(.....);
break;
.....:
case 7:
printf(.....);
break;
default:
printf(......);
break;
}
代码1:如果此时输入1,那么代码会执行case 1的语句,然后一直执行下面的语句直到switch全部语句 执行完
代码2:有了break语句,输入对抑制跳到对应语句,并且执行完成时,会跳出switch语句
代码3:有了defalut语句,如果输入值没有在case中找到对应的,那么就会自动跳转至case语句,且default语句可以放在switch语句体的任何地方
- 代码1(加上defalut子句之后)和代码3在不同的情况下有不同的适用
<二>循环语句
//while语句
- 语法结构:
while(表达式)
循环语句;
- while语句中的break和continue:
break:跳出整个循环,直接终止循环
while(i<=1)
{
if(i == 5)
break;
printf("%d",i);
i++
}
continue:跳过循环后面所有语句,直接返回下一次循环的判断入口
while(i<=10)
{
if(i == 5)
continue;
printf("%d",i);
i++;
}
程序1的结果:1 2 3 4
程序2的结果:1 2 3 4 +∞ 死循环(无法改变判断条件里的变量所导致)
getchar()和putchar()
//getchar:获取字符
int getchar(void);
//putchar:输出字符
int putchar(int character);
getchar与scanf的区别:getchar会读取\0,空格等相同类型字符,而scanf不会读取这些
但是两者都是先从缓冲区读取字符,然后再从我们键盘中输入的地方读取字符
//基本演示
int main()
{
int ch = 0;
while((ch = getchar()) != EOF)//将收到的字符转换为ASCLL码存入ch中
putchar(ch);
return 0;
}
//全输出英文字符和数字字符
int main()
{
int ch = 0;
while((ch = getchar())!=EOF)
{
if(ch <'0' && cha>'9')
//if(ch < 'a' && ch > 'z')
//if(ch < 'A' && ch > 'Z')
continue;
putchar(ch);
}
return 0;
}
//清除缓冲区
int main()
{
char passwords[20] = {0};
printf("请输入密码:");
scanf("%s",passwords);
int tmp = 0;
while((tmp == getchar())!='\0');
//清理除字符以外的所有符号,清理缓冲区
printf("请输入Y或者N:");
int ch = 0;
ch = getchar();
if(ch == 'Y')
printf("right");
else
printf("left");
return 0;
}
//for语句
- 语法结构:
for(表达式1;表达式2;表达式3)
循环语句;
表达式1:初始化部分,初始化循环变量
表达式2:条件判断部分,用于判断循环时候终止
表达式3:调整部分,用于循环的调整
for语句中的break和continue语句
//代码1
int main()
{
int i = 0;
for(i=1;i<=10;i++)
{
if(i==5)
break;
printf("%d ",i);
}
return 0;
}
//代码2:
int main()
{
int i = 0;
for(i=1;i<=10;i++)
{
if(i==5)
continue;
printf("%d ",i);
}
return 0;
}
- for循环中的break语句和while语句一样,是跳出该循环
- 但for循环中continue是跳到for循环的调整部分,而不是像while一样跳到判断部分
- for循环中的break语句和while语句一样,是跳出该循环
- 因此代码1的结果与while相同,而代码2的结果为:1 2 3 4 6 7 8 9 10
注意:不要在for循环体内修改循环变量,防止失去控制
for循环语法结构的变种
<1>for循环的三个变量都可以省,但分号不可以省,一般不建议略
int main()
{
for( ; ; )
{
printf("hehe");//无限打印
}
return 0;
}
<2> 代码2中外循环和内循环次数的乘积即为总共输出的次数
代码3中因为第一次循环时,结果为:i=0,j=10;因为没有初始化,当i=1时进入内循环,j=10保持不变,所以内循环直接结束,后面同理,一共循环了10次
//代码2:
int i = 0;
int j = 0;
for(i = 0;i<10;i++)
{
for(j = 0;j<10;j++)
{
printf("hehe\n");
}
}
//代码3:
int i = 0;
int j = 0;
for(;i<10;i++)
{
for(;j<10;j++)
{
printf("hehe\n");
}
}
<3>使用多余一个变量控制循环
int main()
{
int x,y;
for(x = 0,y = 0;x<2 && y>5;x++,y++)
{
printf("hehe\n");
}
return 0;
}
do-while循环
- 语法结构:
do{
循环语句;
}while(表达式);
特点:循环至少使用一次
do-while循环中的break和continue语句
- 与while语句一摸一样
goto语句
语句特点:多用于跳出多重循环
int main()
{
flag:
printf("hehe"\n);
goto flag;
return 0
}
//死循环
使用goto语句,只要给定跳出标签,可以跳出多重循环,也可以造成死循环