Skip to content

Commit 40eeea9

Browse files
committed
Reviewed Chapter 2
1 parent 513e7c9 commit 40eeea9

File tree

10 files changed

+64
-80
lines changed

10 files changed

+64
-80
lines changed

.vscode/Test.cpp

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
1-
//这段程序可以告诉你当前使用的C++标准和编译器都是什么
2-
#include <iostream> //标准输入输出头文件
3-
using namespace std; //使用std命名空间
4-
int main() { //主函数;以上都是固定格式,照搬就行
5-
cout << "Current C++ Standard: " << __cplusplus << endl; //语言标准
6-
#if defined(__clang__) || defined(__llvm__) //通过检测宏常量判断编译器类型
7-
cout << "Current C++ Compiler: Clang" << endl; //Clang编译器
8-
#elif defined(__GNUC__) || defined(__GNUG__)
9-
cout << "Current C++ Compiler: GCC" << endl; //GCC编译器
10-
#elif defined(_MSC_VER)
11-
cout << "Current C++ Compiler: MSVC" << endl; //MSVC编译器
12-
#else //如果你使用的是其它编译器,那么将会输出Others;本书不推荐读者使用其它编译器
13-
cout << "Current C++ Compiler: Others" << endl;
14-
#endif
1+
#include <iostream>
2+
#include <limits>
3+
int main() {
4+
std::cout<<std::numeric_limits<long double>::min();
155
return 0;
166
}

.vscode/Test.exe

1.04 KB
Binary file not shown.

generalized_parts/02_basic_operation_on_data.tex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
\chapter{数据的基本操作}
2-
在第一章,我们通过一些简单的代码,对C++语言了最基本的认识。我们还了解了数据、信息、内存和面向对象的相关常识。在后面的章节中,我们将更多关注于具体的知识。\par
2+
在第一章,我们通过一些简单的代码,对C++语言有了最基本的认识。我们还了解了数据、信息、内存和面向对象的相关常识。在后面的章节中,我们将更多关注于具体的知识。\par
33
本章我们先来介绍数据。按照分类标准的不同,我们可以把C++语言中的数据分成不同的类别:
44
\begin{itemize}
5-
\item 如果按照数据的类型来分类,数据可以分为整型数据、浮点型数据等等。
5+
\item 如果按照数据的表达方式来分类,数据可以分为整型数据、浮点型数据等等。
66
\item 如果按照是否具名来分类,数据可以分为不具名量\footnote{我们先前提及的``字面量''正是不具名量的一种。}和变量。前者没有名字,后者有名字。
77
\item 如果按照是否可以改变来分类,数据可以分为常量和可变量。前者不可改变,后者可以改变。
88
\item 如果按照是否可取地址来分类,数据可以分为左值和右值。\footnote{有关左值和右值的问题,我们会在精讲篇中讲解。}
99
\item \ldots\ldots
1010
\end{itemize}\par
1111
光是分类还不够。我们还要学会如何更好地使用数据。在第一章中我们通过简单的代码实现了计算器的功能,但如果我们仅仅止步于此,那还远远没有达到C++能够支持的水平。在这一章我们会学习更多有关运算符的知识,以此扩展代码的可能性。\par
12-
数据类型的差异可能会为我们造成一些困扰。在实际编程时,我们可能需要在不同数据类型之间作转换。本章我们也会谈及数据类型转换的基础语法。\par
12+
数据类型的差异可能会为我们造成一些困扰。在实际编程时,我们经常需要在不同数据类型之间作转换。本章我们也会谈及数据类型转换的基础语法。\par
1313
C++的世界非常丰富,但一切都要从数据开始。\par
1414
\import{02_basic_operation_on_data/}{01_assignment_and_constants.tex}
1515
\import{02_basic_operation_on_data/}{02_fundamental_types.tex}

generalized_parts/02_basic_operation_on_data/01_assignment_and_constants.tex

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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\times13$$9\times9$两种简化版。如果咄咄逼人的甲方要求你改成 \lstinline@13@ 或者 \lstinline@9@ 的边长,而你又在你的上千行代码中写下了数百个 \lstinline@19@,你可能会崩溃的。\par

0 commit comments

Comments
 (0)