-
Notifications
You must be signed in to change notification settings - Fork 0
/
ch16s04.html
6 lines (6 loc) · 6.39 KB
/
ch16s04.html
1
2
3
4
5
6
<?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>4. 运算符总结</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="ch16.html" title="第 16 章 运算符详解" /><link rel="prev" href="ch16s03.html" title="3. Side Effect与Sequence Point" /><link rel="next" href="ch17.html" title="第 17 章 计算机体系结构基础" /></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">4. 运算符总结</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ch16s03.html">上一页</a> </td><th width="60%" align="center">第 16 章 运算符详解</th><td width="20%" align="right"> <a accesskey="n" href="ch17.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="id2763540"></a>4. 运算符总结</h2></div></div></div><p>到此为止,除了和指针相关的运算符还没讲之外,其它运算符都讲过了,是时候做一个总结了。</p><p>运算符+ - * / % > < >= <= == != & | ^ 以及各种复合赋值运算符要求两边的操作数类型一致,条件运算符?:要求后两个操作数类型一致,这些运算符在计算之前都需要做Usual Arithmetic Conversion。</p><p>下面按优先级从高到低的顺序总结一下C语言的运算符,每一条所列的各运算符具有相同的优先级,对于同一优先级的多个运算符按什么顺序计算也有说明,双目运算符就简单地用“<span class="quote">左结合</span>”或“<span class="quote">右结合</span>”来说明了。和指针有关的运算符* & ->也在这里列出来了,到<a class="xref" href="ch23.html#pointer">第 23 章 <i>指针</i></a>再详细解释。</p><p>1、标识符、常量、字符串和用()括号套起来的表达式是组成表达式的最基本单元,在运算中做操作数,优先级最高。</p><p>2、后缀运算符,包括数组取下标[]、函数调用()、结构体取成员“<span class="quote">.</span>”、指向结构体的指针取成员->、后缀自增++、后缀自减--。如果一个操作数后面有多个后缀,按照离操作数从近到远的顺序(也就是从左到右)依次计算,比如<code class="literal">a.name++</code>,先算<code class="literal">a.name</code>,再++,这里的<code class="literal">.name</code>应该看成<code class="literal">a</code>的一个后缀,而不是把<code class="literal">.</code>看成双目运算符。</p><p>3、单目运算符,包括前缀自增++、前缀自减--、<code class="literal">sizeof</code>、类型转换()、取地址运算&、指针间接寻址*、正号+、负号-、按位取反~、逻辑非!。如果一个操作数前面有多个前缀,按照离操作数从近到远的顺序(也就是从右到左)依次计算,比如<code class="literal">!~a</code>,先算<code class="literal">~a</code>,再求!。</p><p>4、乘*、除/、模%运算符。这三个运算符是左结合的。</p><p>5、加+、减-运算符。左结合。</p><p>6、移位运算符<<和>>。左结合。</p><p>7、关系运算符< > <= >=。左结合。</p><p>8、相等性运算符==和!=。左结合。</p><p>9、按位与&。左结合。</p><p>10、按位异或^。左结合。</p><p>11、按位或|。左结合。</p><p>12、逻辑与&&。左结合。</p><p>13、逻辑或||。左结合。</p><p>14、条件运算符:?。在<a class="xref" href="ch04s02.html#cond.ifelse">第 2 节 “if/else语句”</a>讲过Dangling-else问题,条件运算符也有类似的问题。例如<code class="literal">a ? b : c ? d : e</code>是看成<code class="literal">(a ? b : c) ? d : e</code>还是<code class="literal">a ? b : (c ? d : e)</code>呢?C语言规定是后者。</p><p>15、赋值=和各种复合赋值(<code class="literal">*=</code> <code class="literal">/=</code> <code class="literal">%=</code> <code class="literal">+=</code> <code class="literal">-=</code> <code class="literal"><<=</code> <code class="literal">>>=</code> <code class="literal">&=</code> <code class="literal">^=</code> <code class="literal">|=</code>)。在双目运算符中只有赋值和复合赋值是右结合的。</p><p>16、逗号运算符。左结合。</p><p><a class="xref" href="bi01.html#bibli.kr" title="The C Programming Language">[<abbr class="abbrev">K&R</abbr>]</a>第2章也有这样一个列表,但是对于结合性解释得不够清楚。左结合和右结合这两个概念只对双目运算符有意义,对于前缀、后缀和三目运算符我单独做了说明。C语言表达式的详细语法规则可以参考<a class="xref" href="bi01.html#bibli.c99" title="ISO/IEC 9899: Programming Languages - C">[<abbr class="abbrev">C99</abbr>]</a>的Annex A.2,其实语法规则并不是用优先级和结合性这两个概念来表述的,有一些细节用优先级和结合性是表达不了的,只有看C99才能了解完整的语法规则。</p><div class="simplesect" lang="zh-cn" xml:lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a id="id2763836"></a>习题</h3></div></div></div><p>1、以下代码得到的<code class="literal">sum</code>是0xffff,对吗?</p><pre class="programlisting">int i = 0;
unsigned int sum = 0;
for (; i < 16; i++)
sum = sum + 1U<<i;</pre></div></div><div class="navfooter"><hr /><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ch16s03.html">上一页</a> </td><td width="20%" align="center"><a accesskey="u" href="ch16.html">上一级</a></td><td width="40%" align="right"> <a accesskey="n" href="ch17.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">3. Side Effect与Sequence Point </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 第 17 章 计算机体系结构基础</td></tr></table></div></body></html>