在C语言中,使用ifelse关键字对条件进行判断。请先看下面的代码:

1. #include <stdio.h>
2. int main()
3. {
4. int age;
5. printf("请输入你的年龄:");
6. scanf("%d", &age);
7. if(age>=18){
8. printf("恭喜,你已经成年,可以使用该软件!\n");
9. }else{
10. printf("抱歉,你还未成年,不宜使用该软件!\n");
11. }
12. return 0;
13. }

可能的运行结果:

请输入你的年龄:23↙
恭喜,你已经成年,可以使用该软件!

或者:

请输入你的年龄:16
抱歉,你还未成年,不宜使用该软件!

这段代码中,age>=18是需要判断的条件,>=表示“大于等于”,等价于数学中的

如果条件成立,也即 age 大于或者等于 18,那么执行if后面的语句(第8行);如果条件不成立,也即 age 小于 18,那么执行else后面的语句(第10行)。

if 和 else 是两个新的关键字,if 意为“如果”,else 意为“否则”,用来对条件进行判断,并根据判断结果执行不同的语句。总结起来,if else 的结构为:

if(判断条件){
    语句块1
}else{
    语句块2
}

意思是,如果判断条件成立,那么执行语句块1,否则执行语句块2 。其执行过程可表示为下图:

r语言中ifelse的 ifelse r语言_#include



所谓语句块(Statement Block),就是由{ }包围的一个或多个语句的集合。如果语句块中只有一个语句,也可以省略{ },例如:

1. if(age>=18) printf("恭喜,你已经成年,可以使用该软件!\n");
2. else printf("抱歉,你还未成年,不宜使用该软件!\n");

由于if else 语句可以根据不同的情况执行不同的代码,所以也叫分支结构或选择结构,上面的代码中,就有两个分支。

求两个数中的较大值:

1. #include <stdio.h>
2. int main()
3. {
4. int a, b, max;
5. printf("输入两个整数:");
6. scanf("%d %d", &a, &b);
7. if(a>b) max=a;
8. else max=b;
9. printf("%d和%d的较大值是:%d\n", a, b, max);
10. return 0;
11. }

运行结果:
输入两个整数:34 28↙
34和28的较大值是:34

本例中借助变量max,用max来保存较大的值,最后将max输出。

只使用if语句

有的时候,我们需要在满足某种条件时进行一些操作,而不满足条件时就不进行任何操作,这个时候我们可以只使用 if 语句。也就是说,if else 不必同时出现。

单独使用 if 语句的形式为:

if(判断条件){
    语句块
}

意思是,如果判断条件成立就执行语句块,否则直接跳过。其执行过程可表示为下图:

r语言中ifelse的 ifelse r语言_#include_02



只使用 if 语句来求两个数中的较大值:

1. #include <stdio.h>
2. int main()
3. {
4. int a, b, max;
5. printf("输入两个整数:");
6. scanf("%d %d", &a, &b);
7. =b;  // 假设b最大
8. if(a>b) max=a;  // 如果a>b,那么更改max的值
9. printf("%d和%d的较大值是:%d\n", a, b, max);
10. return 0;
11. }

运行结果:
输入两个整数:34 28
34和28的较大值是:34

本例程序中,输入两个数a、b。把b先赋予变量max,再用 if 语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。

多个if else语句

if else 语句也可以多个同时使用,构成多个分支,形式如下:

if(判断条件1){
    语句块1
} else  if(判断条件2){
    语句块2
}else  if(判断条件3){
    语句块3
}else  if(判断条件m){
    语句块m
}else{
     语句块n
}

意思是,从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,然后跳到整个 if else 语句之外继续执行其他代码。如果所有判断条件都不成立,则执行语句块n,然后继续执行后续代码。

也就是说,一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行。

例如,使用多个 if else 语句判断输入的字符的类别:

1. #include <stdio.h>
2. int main(){
3. char c;
4. printf("Input a character:");
5. =getchar();
6. if(c<32)
7. printf("This is a control character\n");
8. else if(c>='0'&&c<='9')
9. printf("This is a digit\n");
10. else if(c>='A'&&c<='Z')
11. printf("This is a capital letter\n");
12. else if(c>='a'&&c<='z')
13. printf("This is a small letter\n");
14. else
15. printf("This is an other character\n");
16. return 0;
17. }

运行结果:
Input a character:e↙
This is a small letter

本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。这是一个多分支选择的问题,用多个 if else 语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“e”,输出显示它为小写字符。

在使用 if 语句时还应注意以下两点:

  • 在 if 语句中,判断条件必须用括号括起来。
  • 语句块由{ }包围,但要注意的是在}之后不需要再加分号;(当然加上也没错)。

if语句的嵌套

if 语句也可以嵌套使用,例如:

1. #include <stdio.h>
2. int main(){
3. int a,b;
4. printf("Input two numbers:");
5. scanf("%d %d",&a,&b);
6. if(a!=b){  //!=表示不等于
7. if(a>b) printf("a>b\n");
8. else printf("a<b\n");
9. }else{
10. printf("a=b\n");
11. }
12. return 0;
13. }

运行结果:
Input two numbers:12 68
a<b

if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对,例如:

1. if(a!=b)  // ①
2. if(a>b) printf("a>b\n");  // ②
3. else printf("a<b\n");  // ③

③和②配对,而不是和①配对。

 

 

关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<、<=、>、>=的优先级相同,高于==和!=,==和!=的优先级相同。

在C语言中,有的运算符有两个操作数,例如 10+20,10和20都是操作数,+ 是运算符。我们将这样的运算符称为双目运算符。同理,将有一个操作数的运算符称为单目运算符,将有三个操作数的运算符称为三目运算符。

常见的双目运算符有 +、-、*、/ 等,单目运算符有 ++、-- 等,三目运算符只有一个,就是 ? :,我们将在《C语言条件运算符》中详细介绍。

关系运算符的两边可以是变量、数据或表达式,例如:

1) a+b > c-d
2) x > 3/2
3) 'a'+1 < c
4) -i-5*j == k+1



关系运算符也可以嵌套使用,例如:

1) a > (b > c)
2) a != (c == d)



关系运算符的运算结果只有 0 或 1。当条件成立时结果为 1,条件不成立结果为 0。例如:

  • 5>0 成立,其值为 1;
  • 34-12>100 不成立,其值为 0;
  • (a=3)>(b=5) 由于3>5不成立,故其值为 0。

我们将运算结果 1 称为“真”,表示条件成立,将 0 称为“假”,表示条件不成立。

下面的代码会将关系运算符的结果输出:

1. #include <stdio.h>
2. int main(){
3. char c='k';
4. int i=1, j=2, k=3;
5. float x=3e+5, y=0.85;
6. int result_1 = 'a'+5<c, result_2 = x-5.25<=x+y;
7. printf( "%d, %d\n", result_1, -i-2*j>=k+1 );
8. printf( "%d, %d\n", 1<j<5, result_2 );
9. printf( "%d, %d\n", i+j+k==-2*j, k==j==i+5 );
10. return 0;
11. }

运行结果:
1, 0
1, 1
0, 0

对于含多个关系运算符的表达式,如 k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。

需要提醒的是,==才表示等于,而=表示赋值,大家要注意区分,切勿混淆。

再谈 if 语句的判断条件

if 语句的判断条件中不是必须要包含关系运算符,它可以是赋值表达式,甚至也可以是一个变量,例如:

1. //情况①
2. if(b){
3. //TODO:
4. }
5. //情况②
6. if(b=5){  //情况①
7. //TODO:
8. }

都是允许的。只要整个表达式的值为非0,条件就成立。

上面两种情况都是根据变量 b 的最终值来判断的,如果 b 的值为非0,那么条件成立,否则不成立。

又如,有程序段:

1. if(a=b)
2. printf("%d",a);
3. else
4. printf("a=0");

意思是,把 b 的值赋予 a,如果为非0则输出该值,否则输出“a=0”字符串。这种用法在后面的程序中会经常出现

 

或许你会想到使用嵌套的 if 语句,类似下面这样的代码:

1. #include <stdio.h>
2. int main()
3. {
4. int age;
5. float score;
6. printf("请输入你的年龄和成绩:");
7. scanf("%d %f", &age, &score);
8. if(age >= 18){
9. if(score >= 60){
10. printf("你满足条件,欢迎使用该软件\n");
11. }else{
12. printf("抱歉,你的成绩不及格,不能使用该软件\n");
13. }
14. }else{
15. printf("抱歉,你还未成年,不能使用该软件!\n");
16. }
17. return 0;
18. }

这种方法虽然能够行得通,但不够简洁和专业,我们可以将其压缩为一条 if else 语句:

1. #include <stdio.h>
2. int main()
3. {
4. int age;
5. float score;
6. printf("请输入你的年龄和成绩:");
7. scanf("%d %f", &age, &score);
8. if(age>=18 && score>=60){
9. printf("你满足条件,欢迎使用该软件\n");
10. }else{
11. printf("抱歉,你还未成年,或者成绩不及格,不能使用该软件!\n");
12. }
13. return 0;
14. }

&&是一个新的运算符,称为逻辑运算符,表示age>=18score>=60两个条件必须同时成立才能执行 if 后面的代码,否则就执行 else 后面的代码。

在高中数学中,我们就学过逻辑运算,例如p为真命题,q为假命题,那么“p且q”为假,“p或q”为真,“非q”为真。在C语言中,也有类似的逻辑运算:

运算符

说明

结合性

举例

&&

与运算,双目,对应数学中的“且”

左结合

1&&0、(9>3)&&(b>a)

||

或运算,双目,对应数学中的“或”

左结合

1||0、(9>3)||(b>a)

!

非运算,单目,对应数学中的“非”

右结合

!a、!(2<5)

逻辑运算的结果

在编程中,我们一般将零值称为“假”,将非零值称为“真”。逻辑运算的结果也只有“真”和“假”,“真”对应的值为 1,“假”对应的值为 0。

1) 与运算(&&)

参与运算的两个表达式都为真时,结果才为真,否则为假。例如:

5&&0

5为真,0为假,相与的结果为假,也就是 0。

(5>0) && (4>2)

5>0 的结果是1,为真,4>2结果是1,也为真,所以相与的结果为真,也就是1。

2) 或运算(||)

参与运算的两个表达式只要有一个为真,结果就为真;两个表达式都为假时结果才为假。例如:

10 || 0

10为真,0为假,相或的结果为真,也就是 1。

(5>0) || (5>8)

5>0 的结果是1,为真,5>8 的结果是0,为假,所以相或的结果为真,也就是1。

3) 非运算(!)

参与运算的表达式为真时,结果为假;参与运算的表达式为假时,结果为真。例如:

!0

0 为假,非运算的结果为真,也就是 1。

!(5>0)

5>0 的结果是1,为真,非运算的结果为假,也就是 0。

输出逻辑运算的结果:

1. #include <stdio.h>
2. int main(){
3. int a = 0, b = 10, c = -6;
4. int result_1 = a&&b, result_2 = c||0;
5. printf("%d, %d\n", result_1, !c);
6. printf("%d, %d\n", 9&&0, result_2);
7. printf("%d, %d\n", b||100, 0&&0);
8. return 0;
9. }

运行结果:
0, 0
0, 1
1, 0

优先级

逻辑运算符和其它运算符优先级从低到高依次为:

赋值运算符(=) < &&和|| < 关系运算符 < 算术运算符 < 非(!)

&& 和 || 低于关系运算符,! 高于算术运算符。
 
按照运算符的优先顺序可以得出:

  • a>b && c>d  等价于  (a>b)&&(c>d)
  • !b==c||d<a  等价于  ((!b)==c)||(d<a)
  • a+b>c&&x+y<b  等价于  ((a+b)>c)&&((x+y)<b)

另外,逻辑表达式也可以嵌套使用,例如a>b && b || 9>ca || c>d &&  !p

逻辑运算符举例:

1. #include <stdio.h>
2. int main(){
3. char c='k';
4. int i=1,j=2,k=3;
5. float x=3e+5,y=0.85;
6. printf( "%d,%d\n", !x*!y, !!!x );
7. printf( "%d,%d\n", x||i&&j-3, i<j&&x<y );
8. printf( "%d,%d\n", i==5&&c&&(j=8), x+y||i+j+k );
9. return 0;
10. }

运行结果:
0,0
1,0
0,1

本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x|| i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故x||i&&j-3的逻辑值为 1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y||i+j+k由于x+y的值为非0,故整个或表达式的值为1

 

 

 

C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况。例如,输入一个整数,输出该整数对应的星期几的英文表示:

1. #include <stdio.h>
2. int main(){
3. int a;
4. printf("Input integer number:");
5. scanf("%d",&a);
6. if(a==1){
7. printf("Monday\n");
8. }else if(a==2){
9. printf("Tuesday\n");
10. }else if(a==3){
11. printf("Wednesday\n");
12. }else if(a==4){
13. printf("Thursday\n");
14. }else if(a==5){
15. printf("Friday\n");
16. }else if(a==6){
17. printf("Saturday\n");
18. }else if(a==7){
19. printf("Sunday\n");
20. }else{
21. printf("error\n");
22. }
23. return 0;
24. }

运行结果:
Input integer number:3↙
Wednesday

对于这种情况,实际开发中一般使用 switch 语句代替,请看下面的代码:

1. #include <stdio.h>
2. int main(){
3. int a;
4. printf("Input integer number:");
5. scanf("%d",&a);
6. switch(a){
7. case 1: printf("Monday\n"); break;
8. case 2: printf("Tuesday\n"); break;
9. case 3: printf("Wednesday\n"); break;
10. case 4: printf("Thursday\n"); break;
11. case 5: printf("Friday\n"); break;
12. case 6: printf("Saturday\n"); break;
13. case 7: printf("Sunday\n"); break;
14. default:printf("error\n"); break;
15. }
16. return 0;
17. }

运行结果:
Input integer number:4↙
Thursday

switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分枝的 if else 语句,基本格式如下:

switch(表达式){
    case 整型数值1: 语句 1;
    case 整型数值2: 语句 2;
    ......
    case 整型数值n: 语句 n;
    default: 语句 n+1;
}

它的执行过程是:
1) 首先计算“表达式”的值,假设为 m。

2) 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。

3) 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。

4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。

需要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句。例如:

1. #include <stdio.h>
2. int main(){
3. int a;
4. printf("Input integer number:");
5. scanf("%d",&a);
6. switch(a){
7. case 1: printf("Monday\n");
8. case 2: printf("Tuesday\n");
9. case 3: printf("Wednesday\n");
10. case 4: printf("Thursday\n");
11. case 5: printf("Friday\n");
12. case 6: printf("Saturday\n");
13. case 7: printf("Sunday\n");
14. default:printf("error\n");
15. }
16. return 0;
17. }

运行结果:
Input integer number:4↙
Thursday
Friday
Saturday
Sunday
error

输入4,发现和第四个分支匹配成功,于是就执行第四个分支以及后面的所有分支。这显然不是我们想要的结果,我们希望只执行第四个分支,而跳过后面的其他分支。为了达到这个目标,必须要在每个分支最后添加break;语句。

break 是C语言中的一个关键字,专门用于跳出 switch 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个 switch 执行结束了,接着会执行整个 switch 后面的代码。

使用 break 修改上面的代码:

1. #include <stdio.h>
2. int main(){
3. int a;
4. printf("Input integer number:");
5. scanf("%d",&a);
6. switch(a){
7. case 1: printf("Monday\n"); break;
8. case 2: printf("Tuesday\n"); break;
9. case 3: printf("Wednesday\n"); break;
10. case 4: printf("Thursday\n"); break;
11. case 5: printf("Friday\n"); break;
12. case 6: printf("Saturday\n"); break;
13. case 7: printf("Sunday\n"); break;
14. default:printf("error\n"); break;
15. }
16. return 0;
17. }

运行结果:
Input integer number:4↙
Thursday

由于 default 是最后一个分支,匹配后不会再执行其他分支,所以也可以不添加break;语句。

最后需要说明的两点是:
1) case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。请看下面的例子:

  1. case 10: printf("..."); break; //正确
  2. case 8+9: printf("..."); break; //正确
  3. case 'A': printf("..."); break; //正确,字符和整数可以相互转换
  4. case 'A'+19: printf("..."); break; //正确,字符和整数可以相互转换
  5. case 9.5: printf("..."); break; //错误,不能为小数
  6. case a: printf("..."); break; //错误,不能包含变量
  7. case a+10: printf("..."); break; //错误,不能包含变量

2) default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。