第3章
3.0 C语言三类控制结构
顺序结构
选择结构(分支结构,条件语句,Selection Structure)
重复结构(循环结构,循环语句,Loop Structure)
3.1 关系运算符和逻辑运算符
关系运算符
<、<=、>、>= 左端小于、小于等于、大于、大于等于右端时返回值为1,否则为0。C语言中无布尔类型所以在判断的时候,0为假,非零都为真。
==、!= 左端等于、不等于右端时返回值为1,否则为0
运算符亦具有优先级,第一行中的运算符优先级大于第二行。同一行中的运算符具有相同的优先级。
逻辑运算符
&& 与,|| 或,!非
1) 与运算(&&)
同真则真,否则为假。例如:
7>0 && 2>1
二者的结果都为真(1),相与的结果也为真。
2) 或运算(||)
参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:
5>4 || 5>8
由于5>4为真,相或的结果也就为真。
上面两种运算都是有两个参数的双目运算符。同时,有些情况下只要第一个参数的结果算出,表达式的结果也就知道了(如与运算第一个表达式值为假,或运算第一个值为真),这时候就不会再算右边的表达式。这种规则称为“短路求值”。
3) 非运算(!)
表达式结果为真时,结果为假;表达式结果为假时,结果为真。例如:
!(5>0)
结果为假(0)。
3.2 运算符的优先级
四则运算符>关系运算符>逻辑运算符
逻辑运算符中,优先级为“非”>“与”>“异或”>“或”
值得注意的是双目运算符如与,异或等都是“短路求值”。也就是说如果计算左边就知道答案的话,运算符右边的表达式就不会运行了。
3.3 条件语句
(1)条件语句有两种,第一种是if语句,第二种是if else语句。
句法格式如下:
if (<表达式>) <语句>
在这个语句中,表达式描述后面的语句可以执行的条件。括号内表达式非0时,条件为真,否则为假。如果为真则执行语句,否则不执行。
一个例子:
if (a%2==0)
printf(“%d是偶数\n”,a);
if (<表达式>) <语句1> else <语句2>
if (a%2==0)
printf(“%d是偶数\n”,a);
else
printf(“%d是奇数\n”,a);
(2)如果一个语句不满足我们的需要,我们就要使用复合语句。
下面是一个例子:
{
double a,b;
a=x+y; b=x-y;
z=a*a+b*b;
}
之前例子中的<语句>、<语句1>、<语句2>都可以使单条语句,也可以是复合语句。
不仅如此,我们还可以对条件语句进行嵌套(不再举例)和级联,编译器总是把else与它之前最近的if联系起来:
if (表达式1) 语句1
else if (表达式2) 语句2
…
else 语句n+1
这里需要注意的是,若进行比较的是浮点数,通常不能直接使用“==”和“!=”,而应该在写成fabs(x-a)<EPS。EPS是最大允许的误差,而fabs是对浮点数取绝对值的标准库函数。
(3)还有一类运算符叫做条件运算符,即形如“?:”的三元运算符。由条件运算符及其运算对象构成的表达式被称为条件表达式。语法格式如下:
<表达式1>?<表达式二>:<表达式3>
当表达式1为真时计算表达式2的值作为条件表达式的值,否则计算表达式3的值作为条件表达式的值。
3.5 switch语句
switch语句是一种多路选择的分支结构,语法格式如下:
switch(<控制表达式>){
case <常量表达式1>:语句序列1
case <常量表达式2>:语句序列2
...
case <常量表达式n>:语句序列n
default:<语句序列n+1>
}
default及其所对应的语句序列是可选项,任何一个case所对应的语句序列也可以为空,每个常量表达式的类型必须是整形且各不相同。default后面的语句会在控制表达式的值未在任何一个case中出现时执行。
case后面接多条语句时不需要放在{}中;若连续的case之间没有语句,则他们执行同样的语句。