C语言中的语句可分成五类:表达式语句、函数调用语句、控制语句、复合语句、空语句;
分支和循环语句属于控制语句,控制语句用于控制程序的执行过程,以方便实现程序的各种结构方式,C语言有九种控制语句。
(1)条件判断语句(分支语句):if语句、switch语句;
(2)循环执行语句(循环语句):do while语句,while语句,for语句;
(3)转向语句:break语句,goto语句,continue语句、return语句;
(1)if语句的基本形式如下:只要表达式为真,则执行表达式1;反之则执行表达式2。表达式为真的条件就是表达式判定为真,或者值为真(即不等于0);
在计算机语言中,非0表示真,0表示假。(无论正数负数,只要非0即为真)。
单分支语句 | 双分支语句 | 多分支语句 |
int main() { int a = 10; if (a == 10) { printf("hehe\n"); } return 0; } |
int main() { int a = 10; if (a == 10) { printf("hehe\n"); } else { printf("haha\n"); } return 0; } |
int main() { int a = 5; if (a == 10) { printf("hehe\n"); }else if (a == 5) { printf("haha\n"); }else { printf("无法打印"); } return 0; } |
if (表达式) {
表达式1(如果为真,则执行这个);
}
//else是可以不加的,代表这个判断语句是单分支语句,如果真则执行,假则直接跳过;
//else加上则表达这个判断语句是双分支语句,如果真则执行if中的语句,假则执行else中的语句;
else{
表达式2(如果为假,则执行这个);
}
注意:
(1)if 语句后要执行多条语句,则这些语句一定要用大括号全部包裹起来,如果不加大括号的话则默认执行第一条语句,如果在双分支语句中,则else无法与if匹配,导致程序报错。
(2)else是与离他最近的 if 进行匹配的。(由于每个人的代码习惯不同,可能会导致某些else不是和与他匹配的 if 对齐的,因此,在学习的过程中一定要养成良好的代码书写习惯)
(3)特别注意:= 是赋值的意思,要判断需要使用 == ;
(2)else后面也是可以加上判断语句if的,比如把判断成绩优良(80~100分)、及格(60~80分)、不及格(0~60分)三段,可以用如下代码执行:
int main() {
int gra = 0;
scanf("%d", &gra);
if (gra >= 80 && gra < 100) {
printf("这位同学的成绩为优良");
}
else if (gra >= 60 && gra < 80) {
printf("这位同学的成绩为及格");
}
else if (gra >= 0 && gra < 60) {
printf("这位同学的成绩不及格");
}
else {
printf("输入非法,没有成绩,请重新尝试");
}
return 0;
}
注意:在if中的表达式最好不要表示为 0 < gra < 60,因为如果表示为这样,则会以此判断表达式是否为真,即:先判断前一个大于号左右两边的大小,如果为真则为1,如果为假则为0,而1和0恒小于60,因此表达式为恒假式,永远不会执行条件为真的语句。
if语句适用于较少分支的语句,switch适用于较多分支的语句。
switch语句的格式:switch(整型表达式){语句项;}
语句项的格式:case 整型常量表达式:语句;
int main() {
int num = 0;
scanf("%d", &num);
switch (num)//必须是整型表达式
{
case 1://必须是整型常量
printf("今天是星期一");
break;//如果不加上break,则会依次执行到switch语句结束,或者直至遇到下一个break;
case 2:
printf("今天是星期二");
break;
case 3:
printf("今天是星期三");
break;
case 4:
printf("今天是星期四");
break;
case 5:
printf("今天是星期五");
break;
case 6:
printf("今天是星期六");
break;
case 7:
printf("今天是星期日");
break;
default:
printf("非法字符,不予打印");
break;
}
return 0;
}
(1)default子句:当所有情况下的case都无法匹配的时候,执行default子句;
(2)switch语句:允许嵌套使用;
(3)break只能跳出当前所在的选择或者循环语句,而不是跳出所有的选择与循环语句
生活中有需要进行不断循环的动作,这个时候选择语句和跳转语句都无法实现这个操作,我们需要用循环语句来实现这个循环的动作。循环语句包括while、do while和for语句。
int main() {
int i = 0;//由于while中第一句为i++,因此需要从0开始;
//打印出1到10中的单数
while (i<=9)//由于第一句是i++,因此i=9时进入循环,可得进入if判断时i=10;
{
i++;//放在前面防止死循环;
if (i % 2 == 1) {
continue;//结束本次循环,进入下一循环;
}
printf("%d\n", i);
}
return 0;
}
(1)循环中的break会直接跳出循环,永久的终止了循环;
(2)循环中的continue会跳出本次循环,不执行本次循环中continue之后的语句,而开始下次循环的判断。
(1)scanf读取有一个特性就是遇到空格会停止读取,所以在遇到需要读取空格的情况下我们需要使用gets来进行一行数的读取;
(2)getchar()是字符读取函数,每一次只能读取一个字符,如果读取不成功则返回EOF也就是-1;
int main() {
int ch = getchar();
//getchar()是字符读取函数;如果能正常读取的话,就能够读取到一个字符;
//但是如果不能正常读取,那么getchar会返回一个EOF(相当于-1);
//因为char类型接收不了-1,因此用int定义。
printf("%c\n", ch);
putchar(ch);
}
在键盘输入到读取的过程当中,有一个输入缓冲区。当用户通过键盘输入信息的时候,输入的信息会被放入输入缓冲区中,然后scanf或getchar或gtes才能进行读取。例如:
如果需要读取密码,则密码的几种形式:
(1)如果密码是:abcdef;
当用户通过键盘输入这个的时候,当输入完毕时会按下一个回车键来确认,但这个回车键会被键盘当做一次 \n 放入输入缓冲区,所以如果要用getchar进行,密码确认的时候,getchar不会进行等待输入Y和N,而是直接读取了 \n 。所以我们要在getchar之前再写一个getchar函数来读取这个 \n 字符。
(2)如果密码是:abcdef g;
当密码输入这个的时候,scanf只会读取空格之前的信息,而保留空格和空格之后的信息,因此仅仅使用一次getchar读取是不正确的,我们应该循环使用getchar读取,直到读取到转义字符 \n 。
int main() {
char password[20] = { 0 };
printf("请输入密码为->");
scanf("%s", password);
//通过不断读取清空输入缓冲区;
int ch = 0;
while ((ch = getchar()) != '\n'){//直到遇到'\n'后,跳出循环;
;
}
//完成后在进行下面的getchar读取时,输入缓冲区中没有任何信息,所以需要等待键盘输入;
printf("请确认密码是否正确(Y/N)");
int ret = getchar();
if ('Y' == ret) {
printf("Yes\n");
}
else{
printf("No\n");
}
return 0;
}
while循环 | for循环 |
int main() { int i = 1;//初始化 while (i < 5) {//条件判断 printf("hehe\n"); i++;//调整 } } |
int main() { //直接一体化,便于调整 |
for循环的格式为:for(表达式1;表达式2;表达式3){循环语句;}
(1)表达式1:初始化部分,用于初始化循环变量;可以在初始化部分直接定义变量进行初始化,但是只有在支持c99语法的编译器中才可以使用,如果不支持,会报错;
(2)表达式2:条件判断部分,用于判断循环何时终止;(必须是判断语句)
(3)表达式3:调整部分:用于循环条件的调整。
(4)for循环的执行过程:初始化—>条件判断—>循环体—>调整;continue跳过for循环本次循环后面的代码,但是并不会跳过调整部分,因为continue本质上是跳过循环体;
建议:(1)不可在for循环内部修改循环变量,防止for循环失去控制;(2)建议for循环语句的循环控制变量的取值采用“前闭后开区间”写法:如果写1到10,用的是(int i=1;i < 11;i++),而不是(int i=1;i <= 10;i++);
while循环 | for循环 | do while循环 |
int main() { int i = 1;//初始化 while (i < 5) {//条件判断 printf("hehe\n"); i++;//调整 } } |
int main() { //直接一体化,便于调整 |
int main() { int i = 1; do { printf("hehe\n"); i++; } while (i < 5); } |
do while循环的格式为:do {循环语句;}while(表达式);
(1)do while循环的执行过程:循环体—>条件判断;
(2)while(表达式)后面有一个“ ; ”,一定不能忘记;
(3)do while循环的循环体至少会执行一次;