C语言中由一个分号;隔开的就是一条语句。比如:
int main()
{
int a=10;
10;
;//空语句
return 0;
}
C语言是结构化的程序设计语言
1.顺序结构
2.选择结构
3.循环结构
如果你好好学习,校招时拿号offer,不好好学习,回家种苹果
这就是选择。
那if语句的语法结构是怎么样的呢?
不得不提到一个问题,C语言是如何表示真假?
0表示假,非0表示真
如果表达式的结果为真,则语句执行。
//语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
int main()
{
int age=10;
if(age>=18)
{
printf("成年\n");//如果想打印多条语句,带大括号,若不带,只能控制一条语句
}
else
{
printf("未成年\n");
}
return 0;
}
int main()
{
int age=20;
if(age<18)
{
printf("少年\n");
}
//else if(18<=age<26)//这样写是错误的
//{
// printf("青年\n");
//}
else if(age>=18&&age<26)
printf("青年\n");
else if(age>=26&&age<40)
printf("中年\n");
else if(age>=40&&age<60)
printf("壮年\n");
else if(age>=60&&age<100)
printf("老年\n");
else
printf("长生不老\n");
return 0;
}
悬空else
int main()
{
int a=0;
int b=2;
if(a==1)
if(b==2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
打印结果无,因为if(a==1)压根就没有进去,else与最近的if匹配,所以大家应该有良好的写代码风格,下面的代码是不是更容易读懂呢?显然我们很容易能看懂。
int main()
{
int a=0;
int b=2;
if(a==1)
{
if(b==2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
if书写形式对比
//代码1
int main()
{
if (condition) {
return x;
}
return y;
}
//代码2
int main()
{
if(condition)
{
return x;
}
else
{
return y;
}
}
//代码3
int main()
{
int num = 1;
if(num == 5)
{
printf("hehe\n");
}
}
//代码4
int main()
{
int num = 1;
if(5 == num)
{
printf("hehe\n");
}
}
代码2和代码4更好,逻辑更加清晰,不容易出错。
代码3当我们有时候疏忽将num==5写成num=5时,编译器是不会报错的,但是影响了我们的结果。代码4当我们将5==num写成5=num时,编译器会报错,左值不能是常量。所以良好的代码风格很重要。
判断一个数是不是奇数
int main()
{
int num=15;
if(num%2==1)
{
printf("是奇数");
}
return 0;
}
输出1-100之间的奇数
int main()
{
int i=1;
for(i=1;i<100;i++)
{
if(i%2==1)
{
printf("%d",i);
}
}
return 0;
}
switch语句也是一种分支语句。常常用于多分支的情况。
switch(整形表达式)
{
语句项;
}
那么语句项是什么
case 整形常量表达式:
语句;
//是若干个这样的case语句
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)//switch后的表达式结果必须是整数、字符、枚举量值
{
case 1:
printf("星期1\n");
case 2:
printf("星期2\n");
case 3:
printf("星期3\n");
case 4:
printf("星期4\n");
case 5:
printf("星期5\n");
case 6:
printf("星期6\n");
case 7:
printf("星期7\n");
}
return 0;
}
switch后的表达式结果必须是整数、字符、枚举量值,case后面的常量标号,其类型应与表达式的数据类型相同。
当我输入1时,它把case 1、2、…7都输出了,当我们没有写break时,程序就会一直往下走,
所以需要加break,break是跳出分支,搭配break使用才能实现真正的分支,**break是根据需求加的。**这个我们下面讲解。
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期7\n");
break;
}
return 0;
}
加入break后:
break是根据需求加的
比如1-5输出工作日,6-7输出休息日,则代码如下:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
default用法:
如果表达的值与所有case后面的值都不匹配,程序不会终止,不会报错,但是,当你不想忽略不匹配所以标签的表达式的值怎么办呢?可以在语句列表中加一条default子句,当输入不匹配时,进入default,如下代码:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");//当输入不匹配时,进入default
}
return 0;
}
如图:
这里建议大家写switch语句时,都放一条default子句
while循环
do while循环(下一笔记会讲解)
for循环(下一笔记讲解)
//while(语句)
{
//循环体
}
//当语句为真,则进入循环
//while循环打印1-10
int main()
{
int i = 1;
while(i <= 10)
{
printf("%d",i);
i++;
}
return 0;
}
在whlie循环中,break用于永久的终止循环
int main()
{
int i=1;
while(i<=10)
{
if(i==5)
break;
printf("%d",i);//1 2 3 4
i++;
}
}
在whlie循环中,continue的作用是跳过本次循环continue后边的代码,直接去判断部分,看是否进入下一次循环
int main()
{
int i=1;
while(i<=10)
{
if(i==5)
continue;
printf("%d",i);//1 2 3 4 ,然后进入死循环
i++
}
}
continue会跳过之后的语句,i一直等于5,进入死循环
getchar读取字符
int main()
{
int ch =getchar();
printf("%d\n",ch);
putchar(ch);//输出一个字符
return 0;
}
printf %d输出的是获取字符所对应的ascii码值
int main()
{
int ch=0;
//按ctal+z--getchar就读取结束
while((ch = getchar())!EOF)//EOF :end of file,文件末尾
{
putchar(ch);
}
return 0;
}
大家可以看如下图的解释:
int main()
{
char password[20]={
0};
printf("请输入密码:");
scanf("%s",password);
printf("请确认密码(Y/N):");
int ch=getchar();
if(ch=='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
getchar、scanf输入函数不是在键盘拿到东西,而是从缓冲区中拿到
其实在输入12345678\n时,而scanf只在缓冲区中拿走12345678,而缓冲区中还有\n
getchar发现缓冲区有东西,直接就将\n拿走,ch不等于\0,走了else,所以直接出现确认失败。
那么怎么解决呢?我们只要把\n拿走,看如下代码
int main()
{
char password[20]={
0};
printf("请输入密码:");
scanf("%s",password);
printf("请确认密码(Y/N):");
getchar();//清理缓冲区,处理'\n'
int ch=getchar();
if(ch=='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
getchar();是将\n读取进去,但是我们不用他,就相当于清理掉缓冲区
但是这样并不可取,当我们输入以下时,又直接出现确定失败了,为什么呢?
看下图中的解释:
所以当我们后面出现一串字符时,一个getchar是解决不了问题的,这时我们可以写出另外一个代码处理这个问题
int main()
{
char password[20]={
0};
printf("请输入密码:");
scanf("%s",password);
printf("请确认密码(Y/N):");
//getchar();//清理缓冲区,处理'\n'
//清理缓冲区中的多个字符
int temp=0;
while((temp=getchar())!='\n')
{
;
}
int ch=getchar();
if(ch=='Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
当getchar不等于\n时,进行循环,清理缓冲区得多个字符。
下面这个代码什么意思呢?
int main()
{
int ch=0;
while((ch=getchar())!=EOF)
{
if(ch<'0'||ch>'9')
{
continue;
}
putchar(ch);
}
return 0;
}
它是putchar数字字符的意思,如下图,A就不会读取。