@@ -23,11 +23,11 @@ \subsection*{基本赋值语句}
2323//error: lvalue required as left operand of assignment
2424 cout << n;
2525\end {lstlisting }
26- 我已将编译器的报错信息以注释的方式添加到代码中。它的意思是:赋值运算符的左操作数需要是一个左值。我们不需要管什么是 `` 左值'' ,我们只需要知道,编译器并不允许我们把 \lstinline @ n @ 的值赋给 \lstinline @ n*n @ 。\par
26+ 我已将编译器的报错信息以注释的方式添加到代码中。它的意思是:赋值运算符的左操作数需要是一个左值——我们现在还不需要管什么是 `` 左值'' ,只需知道,给两个数的乘积赋值是没有意义的,编译器也不允许我们这样做 。\par
2727\subsection* {常量 }
2828任何一个变量(广义地讲,对象)在被定义之后都可以修改,这固然很方便,但也可能会遭遇一些问题。\par
2929圆周率的近似值是 \lstinline @3.14 @,我们希望定义一个变量 \lstinline @Pi @,它不会被我们自己,或是别的人随便改动;围棋棋盘上有 \lstinline @19*19 @ 个可放子的交叉点,这是恒定不变的,我们也希望不会有人乱改。\par
30- 但是传统意义上的变量无法禁止修改。C语言使用宏\footnote {宏(Macro),是一种批量转换特定内容的方法。它的功能很像我们常用的`` 查找替换'' 。}来定义一个标识符,并通过预处理将其转换为字面量(字面量无法被修改)来实现禁止修改的效果。而在C++中,我们有更好的方法:使用 \lstinline @const @ 限定符,将变量限定为\textbf {常量(Constant) }。\footnote {广义上讲,`` 常量'' 是`` 变量'' 的一部分。根据\href {https://en.wikipedia.org/wiki/Variable_(computer_science)}{Variable-Wikipedia}的阐释,凡在内存中占据存储空间的具名量都是变量。这点似与数学上的`` 变量'' 概念不同。本书于处理常量变量之关系处也很为难,故约定:\textbf {在需要分清常量和变量的场合下,将它们视为不重合的概念;而在一般场合下,统称其为变量。 }当然,若以 `` 对象 '' 统称之,便没有歧义了。 }\par
30+ 但是传统意义上的变量无法禁止修改。C语言使用宏\footnote {宏(Macro),是一种批量转换特定内容的方法。它的功能很像我们常用的`` 查找替换'' 。}来定义一个标识符,并通过预处理将其转换为字面量(字面量无法被修改)来实现禁止修改的效果。而在C++中,我们有更好的方法:使用 \lstinline @const @ 限定符,将变量限定为\textbf {常量(Constant) }。\footnote {广义上讲,`` 常量'' 是`` 变量'' 的一部分。根据 \href {https://en.wikipedia.org/wiki/Variable_(computer_science)}{Variable-Wikipedia} 的阐释,凡在内存中占据存储空间的具名量都是变量。这点似与数学上的`` 变量'' 概念不同。本书于处理常量变量之关系处也很为难,故约定:\textbf {在需要分清常量和变量的场合下,将它们视为不重合的概念;而在一般场合下,统称其为变量。 }}\par
3131定义一个常量的语法是
3232\ begin{lstlisting}
3333 const <类型> <名字> = <初始化>; //const可以在类型关键字前
@@ -45,7 +45,7 @@ \subsection*{常量}
4545//error: assignment of read-only variable 'Pi'
4646\end {lstlisting }
4747这说明 \lstinline @Pi @ 是一个只读的数据,我们不能对它赋值来进行修改。\par
48- 在C++中,常量是一种\textbf {一经定义就无法修改的量 }。这意味着,我们只能在定义它的同时就给它初始化,而不能把定义和初始化的步骤分开 。\footnote {某种意义上,这也体现出初始化与赋值的区别。}变量则不同,我们可以不进行初始化,或者是在定义之后进行赋值。
48+ 在C++中,常量是一种\textbf {一经定义就无法修改的量 }。这意味着,我们只能——也必须——在定义它的同时就给它初始化 。\footnote {某种意义上,这也体现出初始化与赋值的区别。}变量则不同,我们可以不进行初始化,或者是在定义之后进行赋值。
4949\ begin{lstlisting}
5050 int i; //定义变量但不初始化,此时i的值未定
5151 i = 2; //赋值,这样i的值就确定下来了
@@ -54,7 +54,8 @@ \subsection*{常量}
5454\end {lstlisting }
5555这个报错信息的含义是:\lstinline @i_c @ 作为一个常量,没有被初始化。所以这是不允许的。\par
5656\subsection* {常量与字面量的区别 }
57- 说到这里,你也许会感到困感:如果我们用 \lstinline @const @ 常量就是为了防止数据被修改的话,那为什么不全部使用字面量呢?这里就来介绍一下常量相比于字面量的优点。\par
57+ 说到这里,你也许会感到困感:如果我们用 \lstinline @const @ 常量就是为了防止数据被修改的话,那为什么不全部使用字面量呢?在需要 \lstinline @Pi @ 的场合下,全都使用 \lstinline @3.14 @ 不就行了?\par
58+ 当然可以了。但是相比于直接使用字面量来说,使用常量有一些显著的优点:\par
5859首先,常量可以用标识符来阐述其含义。比如用 \lstinline @Grid @,这就比单纯放一个字面量 \lstinline @19 @ 要容易理解得多,也便于后期我们回顾代码。\par
5960而且,常量容易统一修改。这里的`` 修改'' 不是上文中提到的那种赋值式的修改,而是直接修改定义语句中用来初始化的值。\par
6061我们在一开始设计围棋程序的时候可能没有想到,围棋棋盘的大小还可以有$ 13 \times 13 $ 和$ 9 \times 9 $ 两种简化版。如果咄咄逼人的甲方要求你改成 \lstinline @13 @ 或者 \lstinline @9 @ 的边长,而你又在你的上千行代码中写下了数百个 \lstinline @19 @,你可能会崩溃的。\par
0 commit comments