“教小白精通编程”系列之“C语言教程” (版权所有,不得转载,擅自抄袭转载将承担法律责任)
3. 条件
我们知道C程序总是从main函数的第一条语句开始,顺序往下一条一条地执行,直到最后结束。但有时我们会希望某些语句只有在满足某种条件时才执行。
比如我们出门,如果天下雨了,我们就带一把雨伞,如果不下雨,就没必要带来。或者一个学生如果某门课不及格就要补考,等等。
为了根据不同条件是否满足而决定是否执行某一个语句(块),C语言提供了条件语句,主要有if 和 switch 两种:
if语句
#include <stdio.h>
int main(){
double score;
printf("请输入你的分数:\n");
scanf("%lf",&score);
if(score<60)
printf("不及格,需要补考!\n");
return 0;
}
其中的if(如果)是关键字,用于判断圆括号里的表达式(即score<60)是否为真(成立),决定是否要执行printf语句.
if语句的格式如下:
if语句格式:
if (表达式)
单个语句
如果if里面的表达式为真时,我们需要执行多条语句,则可以将这些语句用花括号包围起来,构成“复合语句”:
if (表达式)
{
...程序块
}
当if里面的表达式为真时,就依次执行这个复合语句的所有语句。
#include <stdio.h>
int main(){
double score;
printf("请输入你的分数:\n");
scanf("%lf",&score);
if(score<60){
printf("你的成绩不及格!\n");
printf("需要参加补考!\n");
}
return 0;
}
上述过程可以用如下的流程图表示: 含义: 如果“表达式_1为真”,则执行其中的程序块。
也可以给if添加一个else语句,意思是:如果if里面的表达式为真,就执行if语句中的程序块1,否则,就执行else对应的程序块2。
if (表达式)
语句块1
else
语句块2
如果语句块1或语句块2中有多条语句,都需要用花括号包围起来。
可以用如下的流程图表示:
含义: 如果“表达式_1为真”,则执行程序块1;否则执行程序块2 。
还可以和else if(否则如果)结合起来,根据多个不同条件执行不同的语句块。
if (表达式_1)
{
...程序块1
}
else if (表达式_2)
{
...程序块2
}
else
{
...其他程序块
}
含义:
如果“表达式_1为真”,则执行表达式_1对应的“程序块1”;
否则如果“表达式_2为真”,就执行表达式_2对应的“程序块2”;
否则就执行其他情况下的“其他程序块”。
例1:
#include <stdio.h>
/* 根据输入整数是否正负等情况,输出不同信息!*/
void main(){
int n;
scanf("%d", &n);
if ( n<0 )
printf (" %d is a 负整数!\n" ,n) ;
else if ( n==0 )
printf (" %d is = 0!\n" ,n) ;
else printf (" %d is a 正整数!\n" ,n) ;
}
注:
英文单词含义:if(如果) , else(否则), else if(否则如果)。
C语言中0被认为是“假”,而"非0值"被认为真。
另外, 比较运算符产生的结果值是:真(1)和假(0)。 逻辑运算符可以对真和假表达式进行逻辑运算。
比较运算符:
< smaller than
<= smaller than or equal to
== equal to
!= not equal to
>= greater than or equal to
> greater than
看一个例子
// C Program to demonstrate the working of arithmetic operators
#include <stdio.h>
int main()
{
int a = 5, b = 5, c = 10;
printf("%d == %d = %d \n", a, b, a == b); // true真
printf("%d == %d = %d \n", a, c, a == c); // false假
printf("%d > %d = %d \n", a, b, a > b); //false
printf("%d > %d = %d \n", a, c, a > c); //false
printf("%d < %d = %d \n", a, b, a < b); //false
printf("%d < %d = %d \n", a, c, a < c); //true
printf("%d != %d = %d \n", a, b, a != b); //false
printf("%d != %d = %d \n", a, c, a != c); //true
printf("%d >= %d = %d \n", a, b, a >= b); //true
printf("%d >= %d = %d \n", a, c, a >= c); //false
printf("%d <= %d = %d \n", a, b, a <= b); //true
printf("%d <= %d = %d \n", a, c, a <= c); //true
return 0;
}
逻辑运算符
&& 且
|| 或
! 非
对于A和B两个数:
只有当A和B都是非0(真)时,逻辑与运算&& 的结果才是真。 只要当A和B有一个非0(真)时,逻辑或运算|| 的结果就是真。 当A非0(真)时,逻辑或运算! 的结果就是假;当A为0(假)时,逻辑或运算! 的结果就是真。
我们看一个例子
// C Program to demonstrate the working of logical operators
#include <stdio.h>
int main()
{
int a = 5, b = 5, c = 10, result;
result = (a == b) && (c > b);
printf("(a == b) && (c > b) equals to %d \n", result);
result = (a == b) && (c < b);
printf("(a == b) && (c < b) equals to %d \n", result);
result = (a == b) || (c < b);
printf("(a == b) || (c < b) equals to %d \n", result);
result = (a != b) || (c < b);
printf("(a != b) || (c < b) equals to %d \n", result);
result = !(a != b);
printf("!(a == b) equals to %d \n", result);
result = !(a == b);
printf("!(a == b) equals to %d \n", result);
return 0;
}
switch语句格式:
switch (表达式)
{
case 常量_表达式_1:
{
...程序块..
break;
}
case 常量_表达式_2:
{
...程序块...
break;
}
default:
{
...程序块..
}
}
含义:
就是当里面的switch表达式等于其中的常量时,就执行其中的程序块, 然后用break跳出整个switch语句,如果不等于任何一个常量,就执行默认(default) 里的程序块。
例2:
#include<stdio.h>
void main( ){
char command;
command = getchar( ); //getchar是一个输入函数,用于从键盘读入一个字符
switch( command){
case ' W ' :
printf( " welcome to come here ! \n " );
break;
case 'P':
printf( " I print some information for you \n " );
break;
default:
printf(" You pressed other key \n ");
break;
}
}
根据字符command是否等于字符常量’W’或’P’而执行对应的程序块。其他情况就执行默认(default)的程序块。
关于switch有几个语法点:
- case 标签必须是整型常量表达式
- case后面的常量表达式值不能相同
- 某个case里定义变量,必须加花括号,否则假如执行其他case会出现“作用域里的该变量定义未初始化”
- default标签可以省略
分别看下面的例子
//下面的switch省略了default标签
int x,y;
switch(x){
case 3.14: //错:case 标签必须是整型常量表达式
//... do something
break;
case y: //错:case 标签必须是整型常量表达式
//... do something
break;
}
int x;
//...
//下面的有2个case的标签值都是1,不能相同!
switch(x){
case 1:
//...
break;
case 1:
//...
break;
case 2:
//...
break;
}
//
switch(1) {
case 1: int x = 0; // 初始化
printf("%d\n",x) ;
break;
default: // 编译错误:跳到 default :会进入 'x' 的作用域而不初始化它
printf("default\n") ;
break;
}
必须将case块里的变量定义放在花括号里
switch(1) {
case 1: { int x = 0;
printf("%d\n",x) ;
break;
} // 'x' 的作用域在此结束
default: printf("default\n") ; // 无错误
break;
}
最后需要说明的是:if语句里可以嵌套其他各种语句包括if语句、while语句、switch语句等。switch语句也是一样。 同样,while,for 等语句里也可以嵌套其他如if语句(请看“4.循环”)。例如:
#include<stdio.h>
void main(){
int x;
scanf("%d",&x);
if(x>=0){
/* 只有1行代码的程序块,
可以省略花括号{ } */
if(x<10)
printf("x<10\n");
else if(x<20)
printf("x>=10且x<20\n");
else if(x<30)
printf("x>=20且x<30\n");
else if(x<40)
printf("x>=30且x<40\n");
else
printf("x>=40\n");
}
else{
printf("x<0!\n");
}
}
练习
1:输入一元二次方向的系数,然后根据判别式的3种情况,输出方程式有2个根、1个根、无根的情况
2. 写一个程序,根据从键盘输入的学生成绩的100制分数,输出学生的等级:优(>=90)、良(<90但大于等于80)、中、及格、不及格5个等级之一。
- 用 switch 语句编写一个相对完整的命令主控程序,用单个字符表示一个命令,根据 用户输入命令字符的不同,输出代表不同命令的一个字符串. 比如一个图书管理程序,大致样子如下:
char cmd;
switch(cmd){
case ‘i’: case ‘I’:
//输出“插入新图书”的提示;
break;
case ‘s’: case ‘S’:
//输出“查询图书\n”的提示;
break;
case ‘p’: case ‘P’:
//输出”打印所有图书\n”的提示; break;
case default;
//输出”程序退出!\n”的提示;
break;
}
您的打赏是对我最大的鼓励!