-
Notifications
You must be signed in to change notification settings - Fork 25
/
ch04s01.html
19 lines (19 loc) · 8.69 KB
/
ch04s01.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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>1. if语句</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="ch04.html" title="第 4 章 分支语句" /><link rel="next" href="ch04s02.html" title="2. if/else语句" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">1. if语句</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch04.html">上一页</a> </td><th width="60%" align="center">第 4 章 分支语句</th><td width="20%" align="right"> <a accesskey="n" href="ch04s02.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="id2718043"></a>1. if语句</h2></div></div></div><p>目前我们写的简单函数中可以有多条语句,但这些语句总是从前到后顺序执行的。除了顺序执行之外,有时候我们需要检查一个条件,然后根据检查的结果执行不同的后续代码,在C语言中可以用分支语句(Selection Statement)<a id="id2717425" class="indexterm"></a>实现,比如:</p><pre class="programlisting">if (x != 0) {
printf("x is nonzero.\n");
}</pre><p>其中<code class="literal">x != 0</code>表示“<span class="quote">x不等于0</span>”的条件,这个表达式称为控制表达式(Controlling Expression)<a id="id2718058" class="indexterm"></a>如果条件成立,则{}中的语句被执行,否则{}中的语句不执行,直接跳到}后面。<code class="literal">if</code>和控制表达式改变了程序的控制流程(Control Flow)<a id="id2718073" class="indexterm"></a>,不再是从前到后顺序执行,而是根据不同的条件执行不同的语句,这种控制流程称为分支(Branch)<a id="id2718082" class="indexterm"></a>。上例中的!=号表示“<span class="quote">不等于</span>”,像这样的运算符有:</p><div class="table"><a id="id2718094"></a><p class="title"><b>表 4.1. 关系运算符和相等性运算符</b></p><div class="table-contents"><table summary="关系运算符和相等性运算符" border="1"><colgroup><col /><col /></colgroup><thead><tr><th>运算符</th><th>含义</th></tr></thead><tbody><tr><td>==</td><td>等于</td></tr><tr><td>!=</td><td>不等于</td></tr><tr><td>></td><td>大于</td></tr><tr><td><</td><td>小于</td></tr><tr><td>>=</td><td>大于或等于</td></tr><tr><td><=</td><td>小于或等于</td></tr></tbody></table></div></div><br class="table-break" /><p>注意以下几点:</p><div class="orderedlist"><ol type="1"><li><p>这里的==表示数学中的相等关系,相当于数学中的=号,初学者常犯的错误是在控制表达式中把==写成=,在C语言中=号是赋值运算符,两者的含义完全不同。</p></li><li><p>如果表达式所表示的比较关系成立则值为真(True)<a id="id2718182" class="indexterm"></a>,否则为假(False)<a id="id2718189" class="indexterm"></a>,在C语言中分别用<code class="literal">int</code>型的1和0表示。如果变量<code class="literal">x</code>的值是-1,那么<code class="literal">x>0</code>这个表达式的值为0,<code class="literal">x>-2</code>这个表达式的值为1。</p></li><li><p>在数学中<code class="literal">a<b<c</code>表示<code class="literal">b</code>既大于<code class="literal">a</code>又小于<code class="literal">c</code>,但作为C语言表达式却不是这样。以上几种运算符都是左结合的,请读者想一下这个表达式应如何求值。</p></li><li><p>这些运算符的两个操作数应该是相同类型的,两边都是整型或者都是浮点型可以做比较,但两个字符串不能做比较,在<a class="xref" href="ch25s01.html#stdlib.strcmp">第 1.5 节 “比较字符串”</a>我们会介绍比较字符串的方法。</p></li><li><p>==和!=称为相等性运算符(Equality Operator)<a id="id2718276" class="indexterm"></a>,其余四个称为关系运算符(Relational Operator)<a id="id2718284" class="indexterm"></a>,相等性运算符的优先级低于关系运算符。</p></li></ol></div><p>总结一下,<code class="literal">if (x != 0) { ... }</code>这个语句的计算顺序是:首先求<code class="literal">x != 0</code>这个表达式的值,如果值为0,就跳过{}中的语句直接执行后面的语句,如果值为1,就先执行{}中的语句,然后再执行后面的语句。事实上控制表达式取任何非0值都表示真值,例如<code class="literal">if (x) { ... }</code>和<code class="literal">if (x != 0) { ... }</code>是等价的,如果<code class="literal">x</code>的值是2,则<code class="literal">x != 0</code>的值是1,但对于<code class="literal">if</code>来说不管是2还是1都表示真值。</p><p>和<code class="literal">if</code>语句相关的语法规则如下:</p><div class="literallayout"><p>语句 → if (控制表达式) 语句<br />
语句 → { 语句列表 }<br />
语句 → ;</p></div><p>在C语言中,任何允许出现语句的地方既可以是由;号结尾的一条语句,也可以是由{}括起来的若干条语句或声明组成的语句块(Statement Block)<a id="id2718370" class="indexterm"></a>,语句块和上一章介绍的函数体的语法相同。注意语句块的}后面不需要加;号。如果}后面加了;号,则这个;号本身又是一条新的语句了,在C语言中一个单独的;号表示一条空语句(Null Statement)<a id="id2718364" class="indexterm"></a>。上例的语句块中只有一条语句,其实没必要写成语句块,可以简单地写成:</p><pre class="programlisting">if (x != 0)
printf("x is nonzero.\n");</pre><p>语句块中也可以定义局部变量,例如:</p><pre class="programlisting">void foo(void)
{
int i = 0;
{
int i = 1;
int j = 2;
printf("i=%d, j=%d\n", i, j);
}
printf("i=%d\n", i); /* cannot access j here */
}</pre><p>和函数的局部变量同样道理,每次进入语句块时为变量<code class="literal">j</code>分配存储空间,每次退出语句块时释放变量<code class="literal">j</code>的存储空间。语句块也构成一个作用域,和<a class="xref" href="ch03s04.html#func.scope">例 3.6 “作用域”</a>的分析类似,如果整个源文件是一张大纸,<code class="literal">foo</code>函数是盖在上面的一张小纸,则函数中的语句块是盖在小纸上面的一张更小的纸。语句块中的变量<code class="literal">i</code>和函数的局部变量<code class="literal">i</code>是两个不同的变量,因此两次打印的<code class="literal">i</code>值是不同的;语句块中的变量<code class="literal">j</code>在退出语句块之后就没有了,因此最后一行的<code class="literal">printf</code>不能打印变量<code class="literal">j</code>,否则编译器会报错。语句块可以用在任何允许出现语句的地方,不一定非得用在<code class="literal">if</code>语句中,单独使用语句块通常是为了定义一些比函数的局部变量更“<span class="quote">局部</span>”的变量。</p><div class="simplesect" lang="zh-cn" xml:lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a id="id2718484"></a>习题</h3></div></div></div><p>1、以下程序段编译能通过,执行也不出错,但是执行结果不正确(根据<a class="xref" href="ch01s03.html#intro.debug">第 3 节 “程序的调试”</a>的定义,这是一个语义错误),请分析一下哪里错了。还有,既然错了为什么编译能通过呢?</p><pre class="programlisting">int x = -1;
if (x > 0);
printf("x is positive.\n");</pre></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch04.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="ch04s02.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">第 4 章 分支语句 </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 2. if/else语句</td></tr></table></div></body></html>