文章目录
语句介绍
1. 选择语句
if
语句和switch
语句允许程序在一组可选项中选择一条特定的去执行
2. 重复语句
while
语句,do
语句和for
语句支持重复(循环)操作
3. 跳转语句
break
语句,continue
语句和goto
语句导致无条件低跳转到程序的某个位置.return
也属于此类
4. 逻辑表达式
包括
if
语句在内的某些C语言都必须测试表达式的值是真
还是假
.在C
语言中,诸如i<j
这样的比较运算会产生整数:0(假)或1(真)
5. 关系运算符
- C语言的关系运算符,和数学上的
<
,>
,≤
,≥
相对应,C语言的表达式产生的结果是0(假)和1(真)- 关系运算符的优先级低于算术运算符,并且关系运算符都是左结合的
i < j < k
在C语言中是合法的,但是可能不是你预期的结果,因为是左结合的,所以上式等价于(i < j) < k
,而i<j的结果是0或者1,所以这明显不是你想要的结果
6. 判等运算符
- 和关系运算符一样,判等运算符也是左结合的,也是产生0(假)或1(真)结果.然而
- 判等运算符的优先级是低于关系运算符的.
i < j == j < k
等价于(i < j) == (j < k)
7. 逻辑运算符
!
一元运算符,逻辑非,&&
二元运算符,逻辑与,||
二元运算符,逻辑或- 逻辑运算符产生的结果也是0或1
- 如果表达式的值为0,那么!表达式的结果为1,如果表达式1和表达式2的值都是非零值,那么表殴打时1&&表达式2的结果为1,如果表达式1或表达式2的值中任意一个是(或者两个都是)非零值,那么表达式1||表达式2的结果为1
- 运算符
&&
和||
都对操作数进行短路
计算.也就是说,这些运算符计算出左操作数的值,然后计算右操作数;如果表达式的值可以由左操作数直接确定,则右操作数将不再去进行运算.- 例如 (i > 0 && ++j > 0) 在 i <=0 的情况下 ++j > 0 这个表达式将不再进行运算
- 运算符!的优先级和一元正负号相同,运算符&&和||的优先级低于关系运算符和判等运算符, 例如表达式
i < j && k == m
等价于(i < j) && (k == m)
,运算符!
是右结合的,而&&
和||
都是左结合的
if 语句介绍
1. 格式
if (表达式) 语句
表达式两边的括号是必需的,它们是if语句的组成部分,不是表达式的内容.
2. 级联if语句介绍
if(表达式)
语句
else if(表达式)
语句
else if(表达式)
语句
else
语句
3. 悬空else的问题
当
if
嵌套的时候,千万要当心著名的悬空else
的问题.
#include <stdio.h>
int main()
{
int x = 10, y = 0, result;
if (y != 0)
if (x != 0)
result = x / y;
else
printf("Error: y is equal to 0");
return 0;
}
结果:
结果什么也没有打印,按照逻辑上来说,应该会打印那个Error的,这是因为if else语句里,else的子句应该属于离它最近的且还未和其他else匹配的if语句.所以正确的习惯是if语句的语句要用括号括起来,这样就不会产生错误配对的情况.
条件表达式
条件运算符
- 表达式1 ? 表达式2:表达式3
- 表达式1和表达式2以及表达式3可以是任何类型的表达式,条件表达式又称为三元运算符.
- 如果表达式1?返回真,则结果是表达式2,否则是表达式3
switch 语句
1. switch 语句的格式
switch(表达式)
{
case 常量表达式: 语句
...
case 常量表达式: 语句
default: 语句
}
- 控制表达式. switch后面必须跟着由圆括号括起来的整型表达式.C语言把字符当成整数来处理,因此switch语句中可以对字符进行判定.但是不能用浮点数和字符串
- 分支标号 每个分支的开头都有一个标号,格式如下: case 常量表达式, 常量表达式很像是普通的表达式,只是不能包含变量和函数调用.5,和5+10都是常量表达式,但是n+10不是,除非n是一个表示常量的宏.
- 分支标号中的常量表达式的值必须是整数(字符也可以)
- 语句: 每个分支标号后面可以跟任意数量的语句.不需要用花括号把这些语句括起来.每条语句的最后一条通常是break语句
- 不允许有重复的分支标号,但是对分支的顺序没有要求,特别是default分支不一定要放置在最后
- case后面可以跟随一个常量表达式,但是多个分支标号可以放置在同一组语句的前面:
switch(grade)
{
case 4:
case 3:
case 2:
case 1:printf("passing");
break;
case 0:printf("Failing");
break;
default:printf("Ellegal grade");
break;
}
switch 语句
不要求必须有default
分支,如果default
不存在,而且控制表达式的值和任何一个分支标号都不匹配的话,控制会直接传给switch
语句后面的语句
2. break语句的作用
break
语句会导致程序跳
出switch
语句,继续执行switch
后面的语句- 需要
break
语句是由于switch
语句实际上是一种基于计算的跳转
.对控制表达式求值的时候,控制会跳转到与switch
表达式的值相匹配的分支标号处.分支标号只是一个说明switch
内部位置的标记.在执行完分支中的最后一条语句的时候,程序控制向下跳转到下一个分支的第一条语句上,而忽略下一个分支的分支标号.如果没有break
语句(或者其他某种跳转语句),控制将会从一个分支继续到下一个分支.
#include <stdio.h>
int main()
{
int grade = 4;
switch (grade)
{
case 4:
printf("four");
case 3:
printf("three");
case 2:
printf("two");
case 1:
printf("one");
case 0:
printf("zero");
default:
printf("Illegal grade");
}
return 0;
}
结果:
switch
语句如果case走完以后,没有break,则会直接跳转到下个case后面的语句,所以明确的指出来break是很好的编程习惯
编程练习
1. 编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的格式:
Enter a 24-hour time: 21:11
Equivalent 12-hour time: 9:11 PM
解析.转换成12小时的格式,就是去判断下当前的时间和关系.
- 如果是0小时,就是显示12:xx AM
- 如果是小于12小时,显示格式就是hours:minutes AM
- 如果是等于12小时,显示的格式是hours:minutes PM
- 如果是大于12小时,显示的格式是 hours-12:minutes PM
#include <stdio.h>
int main()
{
int hours, minutes;
printf("Enter a number:");
scanf("%d:%d", &hours, &minutes);
printf("Equivalent 12-hour time: ");
if (hours == 0)
{
printf("12:%.2d AM\n", minutes);
}
else if (hours < 12)
{
printf("%d:%.2d AM\n", hours, minutes);
}
else if (hours == 12)
{
printf("%d:%.2d PM\n", hours, minutes);
}
else
{
printf("%d:%.2d PM\n", hours - 12, minutes);
}
return 0;
}
结果:
2. 编写一个程序,用户输入4个整数中的最大值和最小值:
#include <stdio.h>
int main()
{
int a, b, c, d, maxNumber, minNumber;
printf("Enter four Integers: ");
scanf("%d %d %d %d", &a, &b, &c, &d);
if (a > b && a > c && a > d)
{
maxNumber = a;
if (b < c && b < d)
{
minNumber = b;
}
else
{
minNumber = c < d ? c : d;
}
}
else if (b > c && b > d)
{
maxNumber = b;
if (a < c && a < d)
{
minNumber = a;
}
else
{
minNumber = c < d ? c : d;
}
}
else if (c > d)
{
maxNumber = c;
if (a < d && a < b)
{
minNumber = a;
}
else
{
minNumber = b < d ? b : d;
}
}
else
{
maxNumber = d;
if (a < b && a < c)
{
minNumber = a;
}
else
{
minNumber = b < c ? b : c;
}
}
printf("Largest: %d\n", maxNumber);
printf("Smallest: %d\n", minNumber);
return 0;
}
结果:
3.利用switch语句编写一个程序,把用数字表示的成绩转换为字母表示的等级
#include <stdio.h>
int main()
{
int grade, gradeClass;
char gradeChar;
printf("Enter numerical grade: ");
scanf("%d", &grade);
gradeClass = grade / 10;
switch (gradeClass)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
gradeChar = 'F';
break;
case 6:
gradeChar = 'D';
break;
case 7:
gradeChar = 'C';
break;
case 8:
gradeChar = 'B';
break;
case 9:
case 10:
gradeChar = 'A';
break;
default:
gradeChar = 'X';
break;
}
if (gradeChar == 'X')
{
printf("%d 成绩输入错误,必须是0-100之间", grade);
}
else
{
printf("Letter grade: %c", gradeChar);
}
return 0;
}
结果: