Lesson 3:变量

用类型、初始化、赋值、作用域和 const 建立变量的有效状态模型。

学习目标

  • 能解释变量的名字、类型、存储和值分别回答什么问题
  • 能比较初始化与赋值,写出在首次读取前始终有效的变量声明
  • 能分析整型、浮点型、字符型和布尔型转换造成的信息保留与丢失

来源、版次与标准边界

“Lesson 3:变量”以 SB Creative 出版社书页核定高桥麻奈著、第 5 版、2017 年 6 月 14 日发行、ISBN 978-4-7973-9259-3;出版社页面标 596 页。CiNii Books 书目与 16 课目录记录正文 xxiii+571 页,日本国会图书馆书目记录 571 页。页数口径存在前置页差异,因此本课程不拿页码充当目录证据。

“Lesson 3:变量”的中文说明、示例、交互、练习和答案均为独立教学重写。公开资料只确认 16 个 Lesson 标题;本页列出的细分概念是课程教学映射,不冒充原书逐级小节。技术规则参考 ISO C++ 标准入口复核,但 2017 年教材的 Visual Studio 2017 语境不会被静默升级为 C++23;现代写法只能明确标为迁移说明。

围绕“名字、存储、类型解释和有效值怎样共同决定一次变量读取是否合法?”,本页要求保留“声明位置、初始化路径、作用域、更新前后值、编译器告警和边界输入。”。若故障“读取尚未初始化的局部变量”无法在同一输入下制造首个分岔,应拒绝当前解释,而不是追加随机样例。

为什么变量不是贴着名字的空盒子

程序要保存年龄、价格、字符和判断结果,就需要一块可被后续语句引用的状态。C++ 的变量同时包含四项信息:名字供源代码引用,类型规定可表示的值与操作,存储保存位模式,当前值是按类型解释该位模式所得的结果。只说“变量是盒子”不够,因为同一组位按 intchar 或浮点规则解释会得到不同意义。

例如十进制数值 65 与字符 'A' 在常见字符编码下可能关联到相同整数码,但一个变量表达数量,另一个表达字符。编译器依据声明类型选择输出、比较和转换规则;业务意义仍要由清楚的名字与约束补足。由此可见,存储空间只回答“放在哪里”,类型才回答“如何读写”,名字则回答“这份状态在问题域中代表什么”。

声明同时建立名字和约束

int age = 18;
double price = 12.5;
char grade = 'A';
bool available = true;

int 适合整数,double 适合带小数的近似实数,char 保存一个字符代码单元,bool 表示真假。类型不是根据未来输入自动改变的标签;一旦变量声明为 int,后续赋值会先尝试转换成 int 可表示的值。

选择类型要从领域约束出发:人数不能是 3.7,价格是否能接受二进制浮点近似要由业务决定,字符与完整文本也不是同一层。不要只按“现在看起来能放下”选择,而要考虑范围、精度、合法操作和与外部接口的契约。

初始化与赋值发生在不同时间

初始化发生在对象生命周期开始时,建立第一个状态;赋值发生在对象已经存在之后,用新值替换旧值。内置局部变量若只写 int score;,在被赋值前读取会产生未定义行为。最简单的防线是声明即初始化。

int score = 0;      // 初始化
score = 95;         // 赋值
 
int level{3};       // 列表初始化
double ratio{0.75};

花括号列表初始化能拒绝明显窄化,例如 int count{3.8}; 无法通过编译;int count = 3.8; 则可能静默丢掉小数。入门阶段优先使用明确初值和花括号,可以让“数据是否丢失”更早暴露。

赋值会执行类型转换

当右侧类型与左侧不同,C++ 会按规则转换。转换可能扩大表示范围,也可能丢失信息。doubleint 会截去小数部分;超出目标整型可表示范围时结果不能当作可靠业务值;较小整数参与表达式时还会发生提升。

double measured = 19.75;
int whole = measured;       // whole 为 19,小数信息丢失
double restored = whole;    // 19.0,丢失的信息不会回来

先预测:restored 是 19.75 还是 19.0?第二次转换只能把整数 19 表示成 double,无法恢复第一次已经丢掉的 .75。这说明“最终类型够大”不能修复早先的窄化。

const 把不应修改写进类型

若一个值在初始化后不应改变,可用 const 表达约束。编译器会拒绝后续写入,让设计意图变成可检查规则,而不是只靠注释提醒。

const int daysPerWeek = 7;
const double taxRate = 0.13;

const 对象通常必须初始化,因为之后不能再赋值。它不等于“编译期常量”的全部含义,也不自动让引用到的外部对象永远不变;当前阶段先掌握最直接契约:通过这个变量名不能修改其值。

作用域决定名字在哪里可见

花括号形成块作用域,变量从声明点开始可见,离开块后名字不再可用,对象通常也结束生命周期。内层可以声明同名变量并遮蔽外层,但这样会让读者难以判断实际读写的是哪一个对象。

变量应放在最小但足够的作用域,并靠近第一次使用处初始化。这样有效状态更容易证明,名称冲突更少,也不会让与任务无关的代码意外修改它。

从输入建立有效状态

声明变量只是准备接收值,输入是否成功仍要验证。把对象初始化为已知值,再检查 std::cin,可以让失败路径明确。

int count = 0;
if (!(std::cin >> count)) {
    std::cerr << "count must be an integer\n";
    return 1;
}

这里变量始终有状态,但只有输入成功后的 count 才代表用户提供的数量。初始化不能替代验证;它的作用是避免失败路径读取不确定状态,并为错误处理提供稳定起点。

三步建立变量证据链

分步1 / 3

第一步:声明领域状态

为年龄、价格、等级和是否可用分别选择类型,写清范围和允许操作,再把名字映射到存储与解释规则。

正式节点与章专属证据

  • 变量:在“Lesson 3:变量”中核对输入、状态变化、失败模式和可复现证据;第 1 个节点必须能回到“变量在每次读取前已经初始化,且其值满足类型与业务共同规定的范围。”。
  • 数据类型:在“Lesson 3:变量”中核对输入、状态变化、失败模式和可复现证据;第 2 个节点必须能回到“变量在每次读取前已经初始化,且其值满足类型与业务共同规定的范围。”。
  • 变量初始化:在“Lesson 3:变量”中核对输入、状态变化、失败模式和可复现证据;第 3 个节点必须能回到“变量在每次读取前已经初始化,且其值满足类型与业务共同规定的范围。”。
  • 常量:在“Lesson 3:变量”中核对输入、状态变化、失败模式和可复现证据;第 4 个节点必须能回到“变量在每次读取前已经初始化,且其值满足类型与业务共同规定的范围。”。

先用输入合同检查本页正式节点,再在相同初值下逐步比较正常和失败轨迹,最后只启用“读取尚未初始化的局部变量”完成反例与复位。三个交互都必须能独立重置,且重置后再次满足“变量在每次读取前已经初始化,且其值满足类型与业务共同规定的范围。”。

输入与状态合同

Lesson 3:变量

名字、存储、类型解释和有效值怎样共同决定一次变量读取是否合法?

必须先声明

为变量声明输入类型、有效范围、对象生命周期和失败策略。

可复核证据

保存Lesson 3:变量的原始输入、初值与第一条可检查诊断。

正式节点:变量、数据类型、变量初始化、常量

编译与运行轨迹

同一输入下比较正常与失败路径

  1. 01声明类型与名字
  2. 02用可检查值初始化
  3. 03在有效作用域内更新
  4. 04读取前验证范围

不变量:变量在每次读取前已经初始化,且其值满足类型与业务共同规定的范围。

故障定位与复位

一次只破坏一个前提

基线可继续:变量在每次读取前已经初始化,且其值满足类型与业务共同规定的范围。

小结

  • 变量由名字、类型、存储、值和生命周期共同定义;类型决定表示范围与允许操作
  • 初始化建立首个状态,赋值替换已有状态;局部内置变量应在首次读取前明确初始化
  • 不同类型之间的赋值会转换,窄化丢失的信息无法靠后续扩大类型恢复
  • const 把“初始化后不应修改”变成编译器可检查的约束
  • 作用域控制名字可见性与对象生命周期,变量应靠近使用点并避免无意义遮蔽

练习

  1. 问题 1:拆解变量模型。 int age{18}; 中名字、类型、首值和存储各自是什么?
  1. 问题 2:判断窄化。 double x=7.9; int n=x; double y=n; 中 n 与 y 分别是什么,为什么?
  1. 问题 3:设计输入状态。 为什么 int count=0; 之后仍要检查 std::cin >> count

名词解释

名词解释

本章出现的专业名词,用大白话再讲一遍。

变量
具有名字、类型、存储和生命周期,可保存状态的对象。
数据类型
规定表示范围、解释规则和可用操作的分类。
初始化
在对象生命周期开始时建立首个状态。
const
限制通过该对象名修改值的类型修饰符。
作用域
名字可被查找和使用的源代码范围。

资料与写作方式声明

本章以高桥麻奈 2017 年 C++ 入门教材第 5 版权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

讨论

评论区加载中…