参考资料:高教版《全国计算机等级考试二级教程——C语言程序设计》、《21天学通C语言》
关系运算和逻辑运算
C语言的逻辑值
在C语言中,用非0表示“真”,用0表示“假”。
关系运算符和关系表达式
所谓关系运算实际上是“比较运算”,即进行两个数的比较,判断比较的结果是否符合指定的条件。
C语言的关系运算符
C语言提供了6种关系运算符,它们分别是:
- <(小于)
- <=(小于或等于)
- > (大于)
- >=(大于或等于)
- ==(等于)
- !=(不等于)
注意:由两个字符组成的运算符之间不能有空格。
关系运算符是双目运算符,并且具有自左至右的结合性。
关系表达式及关系表达式的值
由关系运算符构成的表达式,称为关系表达式。关系表达式的计算结果为“逻辑值”,只有两种可能:真(1)或假(0)。
逻辑运算符和逻辑表达式
C语言的逻辑运算符
C语言提供了3种逻辑运算符,分别是:
- &&(与)
- ||(或)
- !(非)
其中,&&和||为双目运算符,!为单目运算符并且出现在对象的左边。
逻辑表达式和逻辑表达式的值
由逻辑运算符和运算对象组成的表达式称为逻辑表达式。逻辑运算的对象可以是C语言中任意合法的表达式。
如果表达式中使用了逻辑运算符,那么该表达式的计算结果取决于其运算对象。逻辑表达式的运算结果或者为1(真),或者为0(假)。
当a和b为任意合法表达式时,逻辑运算规则如下表:
表达式 | 计算结果 |
---|---|
a&&b | 当且仅当a与b都为真时,表达式为真(1);否则表达式为假(0)。 |
a||b | a和b有一个为真,表达式为真(1);a和b都为假,表达式为假(0)。 |
!a | 如果a为真,表达式为真(0);如果a为假,表达式为假(1)。 |
if语句和用if语句构成的选择结构
if语句
if语句的基本格式是,对表达式求职并根据求值结果命令程序执行特定内容。if语句的格式如下:
if (表达式)
语句
如果表达式为真,就执行语句;如果表达式为假,则不执行语句。可以认为,是否执行语句取决于表达式的结果。
通过使用复合语句或块,if语句可以控制多条语句的执行。
else子句
if语句可以包含else子句,方法如下:
if (表达式)
语句1;
else
语句2;
如果表达式计算结果为真,则执行语句1。如果表达式计算结果为假,控制将转到else语句,执行语句2。语句1和语句2都可以是复合语句或块。
关于if语句的说明
- if后面圆括号中的表达式,可以是任意合法的C语言表达式(如:逻辑表达式、关系表达式、算术表达式、赋值表达式等),也可以是任意类型的数据(如:整型、实型、字符型、指针型等)。
- 无论是否有else子句,if子句中如果只有一条语句,则此语句后的分号不能省略。
嵌套的if语句
内嵌的if语句既可以嵌套在if子句中,也可以嵌套在else子句中。
在if子句中嵌套具有else子句的if语句
if (表达式1)
if (表达式2)
语句1
else
语句2
else
语句3
当表达式1的值非0时,执行内嵌的if-else语句;当表达式1的值为0时,执行语句3。
在if子句中嵌套不含else子句的if语句
if (表达式1)
{
if (表达式2)
语句1
}
else
语句2
注意:在if子句中的一对花括号不可缺少。因为C语言的语法规定:else子句总是与前面最近的不带else子句的if相结合,与书写格式无关。
在else子句中嵌套if语句
语句形式1:内嵌的if语句带有else子句:
if (表达式1)
语句1
else if (表达式2)
语句2
else
语句3
语句形式2:内嵌的if语句不带else子句:
if (表达式1)
语句1
else if (表达式2)
语句2
条件表达式构成的选择结构
条件运算符
条件运算符由两个运算符组成,它们是"?"和“:”。条件运算符是C语言唯一的三元运算符,这意味着需要3个运算对象。
由条件运算符构成的条件表达式
条件表达式的形式如下:
表达式1 ? 表达式2 : 表达式3
条件表达式的运算功能
当表达式1的值为非0时,求出表达式2的值,此时表达式2的值就是整个条件表达式的值。
当表达式1的值为0时,则求表达式3的值,这时表达式3的值为整个条件表达式的值。
switch语句以及用switch语句和break语句构成的选择结构
switch语句
switch语句形式如下:
switch (表达式)
{
case 常量表达式1:
语句1
case 常量表达式2:
语句2
…
case 常量表达式n:
语句n
default:
语句n+1
}
说明:
- switch是C语言的关键字,switch后用花括号括起来的部分称为switch语句体。
- 紧跟在switch后一对圆括号中的表达式可以是整型表达式及字符型表达式等。
- case也是关键字,与其后面的常量表达式合称case语句标号。常量表达式的类型必须与switch后圆括号中的表达式类型相同,各case语句标号的值应该互不相同。
- default也是关键字,起标号的作用,代表所有case标号之外的那些标号。default标号可以出现在语句体中任何标号位置上。在switch语句体中也可以没有default标号。
- case语句标号后的语句1,语句2等,可以是一条语句,也可以是若干条语句。
- 必要时,case语句标号后的语句可以省略不写。
- 在关键字case和常量表达式之间一定要有空格。
switch语句的执行过程
switch语句对表达式求值,并与每个case标签后的常量表达式作比较,会出现下面的情况之一:
- 如果找到与表达式匹配的常量表达式,程序将跳转执行case标签后面的语句。
- 如果没有匹配的常量表达式,程序将跳转执行default标签(可选)后面的语句。
- 如果没有匹配的常量表达式,也没有default标签,程序将跳过switch语句体,去执行switch语句之后的语句。
程序举例:
#include <stdio.h>
int main ( void )
{
int reply;
puts ("Enter a number between 1 and 5:");
scanf ("%d", &reply);
switch (reply)
{
case 0:
break;
case 1:
puts("You entered 1.");
case 2:
puts("You entered 2.");
case 3:
puts("You entered 3.");
case 4:
puts("You entered 4.");
case 5:
puts("You entered 5.");
default:
puts("Out of range, try again.");
}
return 0;
}
假设输入2,那么输出为:
Enter a number between 1 and 5:
2
You entered 2.
You entered 3.
You entered 4.
You entered 5.
Out of range, try again.
看上去虽然switch语句找到了第一个匹配的常量表达式,然后却执行了后面的所有语句(并非只执行匹配的语句)。情况确实如此,事实上,switch语句执行了下面要讲的goto语句来匹配常量表达式。为确保只执行与匹配常量表达式相关的语句,还需要包含break语句。
在switch语句体中使用break语句
berak为C语言关键字,berak语句又称间断语句。可以将break语句放在case标号之后的任何位置,通常是case之后的语句最后加上break语句。每当执行到break语句时,立即跳出switch语句体。
利用break语句修改上面的程序:
#include <stdio.h>
int main ( void )
{
int reply;
puts ("Enter a number between 1 and 5:");
scanf ("%d", &reply);
switch (reply)
{
case 1:
{
puts("You entered 1.");
break;
}
case 2:
{
puts("You entered 2.");
break;
}
case 3:
{
puts("You entered 3.");
break;
}
case 4:
{
puts("You entered 4.");
break;
}
case 5:
{
puts("You entered 5.");
break;
}
default:
{
puts("Out of range, try again.");
break;
}
}
return 0;
}
假设输入2,那么输出为:
Enter a number between 1 and 5:
2
You entered 2.
语句标号和goto语句
语句标号
在C语言中,语句标号不必特意加以定义,标号可以是任意合法的标识符,当在标识符后面加一个冒号,如:flag1:、stop0:,该标识符就成了一个语句标号。
注意:在C语言中,语句标号必须是标识符,因此不能简单地使用10:、15:等形式。标号可以和变量同名。
在C语言中,可以在任何语句前加上语句标号。例如:
stop: printf("End\n");
goto语句
goto语句称为无条件转向语句。程序执行至goto语句时,将立即跳转至goto语句指定的位置继续执行。
与if语句不同的是,该语句是无条件的,因为无论情况如何,程序执行到goto语句都会进行跳转。
goto语句的一般形式如下:
goto 语句标号;
注意:该语句标号必须与goto语句在同一个函数内。
运算符优先级归纳
注:表中同一行的运算符优先级相同。
优先级 | 运算符 |
---|---|
1 | ( )(函数运算符) [ ](数组运算符) -> |
2 | ! ~ ++ -- *(间接运算符) &(取址运算符) sizeof +(一元) -(一元) |
3 | *(乘法) / % |
4 | +(二元) -(二元) |
5 | >> << |
6 | < <= > >= |
7 | == != |
8 | &(按位与) |
9 | ^ |
10 | \ |
11 | && |
12 | \ |
13 | ?: |
14 | = += -= *= /= &= ^= |= <<= >>= |
15 | , |