-
Notifications
You must be signed in to change notification settings - Fork 25
/
ch04s02.html
42 lines (42 loc) · 8 KB
/
ch04s02.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>2. if/else语句</title><link rel="stylesheet" href="styles.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.73.2" /><link rel="start" href="index.html" title="Linux C编程一站式学习" /><link rel="up" href="ch04.html" title="第 4 章 分支语句" /><link rel="prev" href="ch04s01.html" title="1. if语句" /><link rel="next" href="ch04s03.html" title="3. 布尔代数" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">2. if/else语句</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04s01.html">上一页</a> </td><th width="60%" align="center">第 4 章 分支语句</th><td width="20%" align="right"> <a accesskey="n" href="ch04s03.html">下一页</a></td></tr></table><hr /></div><div class="sect1" lang="zh-cn" xml:lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="id2718511"></a>2. if/else语句</h2></div></div></div><p><code class="literal">if</code>语句还可以带一个<code class="literal">else</code>子句(Clause)<a id="id2718531" class="indexterm"></a>,例如:</p><pre class="programlisting">if (x % 2 == 0)
printf("x is even.\n");
else
printf("x is odd.\n");</pre><p>这里的%是取模(Modulo)<a id="id2718547" class="indexterm"></a>运算符,<code class="literal">x%2</code>表示<code class="literal">x</code>除以2所得的余数(Remainder)<a id="id2718567" class="indexterm"></a>,C语言规定%运算符的两个操作数必须是整型的。两个正数相除取余数很好理解,如果操作数中有负数,结果应该是正是负呢?C99规定,如果<code class="literal">a</code>和<code class="literal">b</code>是整型,<code class="literal">b</code>不等于0,则表达式<code class="literal">(a/b)*b+a%b</code>的值总是等于<code class="literal">a</code>,再结合<a class="xref" href="expr.expression.html" title="5. 表达式">第 5 节 “表达式”</a>讲过的整数除法运算要Truncate Toward Zero,可以得到一个结论:<span class="emphasis"><em>%运算符的结果总是与被除数同号</em></span>(想一想为什么)。其它编程语言对取模运算的规定各不相同,也有规定结果和除数同号的,也有不做明确规定的。</p><p>取模运算在程序中是非常有用的,例如上面的例子判断<code class="literal">x</code>的奇偶性(Parity)<a id="id2718632" class="indexterm"></a>,看<code class="literal">x</code>除以2的余数是不是0,如果是0则打印<code class="literal">x is even.</code>,如果不是0则打印<code class="literal">x is odd.</code>,读者应该能看出<code class="literal">else</code>在这里的作用了,如果在上面的例子中去掉<code class="literal">else</code>,则不管<code class="literal">x</code>是奇是偶,<code class="literal">printf("x is odd.\n");</code>总是执行。为了让这条语句更有用,可以把它封装(Encapsulate)<a id="id2718684" class="indexterm"></a>成一个函数:</p><pre class="programlisting">void print_parity(int x)
{
if (x % 2 == 0)
printf("x is even.\n");
else
printf("x is odd.\n");
}</pre><p>把语句封装成函数的基本步骤是:<span class="emphasis"><em>把语句放到函数体中,把变量改成函数的参数</em></span>。这样,以后要检查一个数的奇偶性只需调用这个函数而不必重复写这条语句了,例如:</p><pre class="programlisting">print_parity(17);
print_parity(18);</pre><p><code class="literal">if/else</code>语句的语法规则如下:</p><div class="literallayout"><p>语句 → if (控制表达式) 语句 else 语句</p></div><p>右边的“<span class="quote">语句</span>”既可以是一条语句,也可以是由{}括起来的语句块。一条<code class="literal">if</code>语句中包含一条子语句,一条<code class="literal">if/else</code>语句中包含两条子语句,子语句可以是任何语句或语句块,当然也可以是另外一条<code class="literal">if</code>或<code class="literal">if/else</code>语句。根据组合规则,<code class="literal">if</code>或<code class="literal">if/else</code>可以嵌套使用。例如可以这样:</p><pre class="programlisting">if (x > 0)
printf("x is positive.\n");
else if (x < 0)
printf("x is negative.\n");
else
printf("x is zero.\n");</pre><p>也可以这样:</p><pre class="programlisting">if (x > 0) {
printf("x is positive.\n");
} else {
if (x < 0)
printf("x is negative.\n");
else
printf("x is zero.\n");
}</pre><p>现在有一个问题,类似<code class="literal">if (A) if (B) C; else D;</code>形式的语句怎么理解呢?可以理解成</p><pre class="programlisting">if (A)
if (B)
C;
else
D;</pre><p>也可以理解成</p><pre class="programlisting">if (A)
if (B)
C;
else
D;</pre><p>在<a class="xref" href="ch02s01.html#expr.helloworldcont">第 1 节 “继续Hello World”</a>讲过,C代码的缩进只是为了程序员看起来方便,实际上对编译器不起任何作用,你的代码不管写成上面哪一种缩进格式,在编译器看起来都是一样的。那么编译器到底按哪种方式理解呢?也就是说,<code class="literal">else</code>到底是和<code class="literal">if (A)</code>配对还是和<code class="literal">if (B)</code>配对?很多编程语言的语法都有这个问题,称为Dangling-else<a id="id2718844" class="indexterm"></a>问题。C语言规定,<span class="emphasis"><em><code class="literal">else</code>总是和它上面最近的一个<code class="literal">if</code>配对</em></span>,因此应该理解成<code class="literal">else</code>和<code class="literal">if (B)</code>配对,也就是按第二种方式理解。如果你写成上面第一种缩进的格式就很危险了:你看到的是这样,而编译器理解的却是那样。如果你希望编译器按第一种方式理解,应该明确加上{}:</p><pre class="programlisting">if (A) {
if (B)
C;
} else
D;</pre><p>顺便提一下,浮点型的精度有限,不适合用==运算符做精确比较。以下代码可以说明问题:</p><pre class="programlisting">double i = 20.0;
double j = i / 7.0;
if (j * 7.0 == i)
printf("Equal.\n");
else
printf("Unequal.\n");</pre><p>不同平台的浮点数实现有很多不同之处,在我的平台上运行这段程序结果为<code class="literal">Unequal</code>,即使在你的平台上运行结果为<code class="literal">Equal</code>,你再把<code class="literal">i</code>改成其它值试试,总有些值会使得结果为<code class="literal">Unequal</code>。等学习了<a class="xref" href="ch14s04.html#number.float">第 4 节 “浮点数”</a>你就知道为什么浮点型不能做精确比较了。</p><div class="simplesect" lang="zh-cn" xml:lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a id="id2718936"></a>习题</h3></div></div></div><p>1、写两个表达式,分别取整型变量<code class="literal">x</code>的个位和十位。</p><p>2、写一个函数,参数是整型变量<code class="literal">x</code>,功能是打印<code class="literal">x</code>的个位和十位。</p></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04s01.html">上一页</a> </td><td width="20%" align="center"><a accesskey="u" href="ch04.html">上一级</a></td><td width="40%" align="right"> <a accesskey="n" href="ch04s03.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">1. if语句 </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 3. 布尔代数</td></tr></table></div></body></html>