NOI C++ 课程体系 / 语法入门 / 第3讲
CSP-J 入门级 · 语法入门 · 输入输出与赋值语句专题

C++ 输入输出与赋值语句 完全指南

让程序学会"听"和"说" —— cin 输入、cout 输出、= 赋值三大基本功逐一讲透,方向判断、链式写法、复合赋值、变量交换一次看清。

6 大教学模块 3 条核心语句精讲 5 个精讲案例 5 大易错点 1 张速查表 15 道分层练习
本讲 · 第 7/56 讲输入输出与赋值语句
模块 01

情景导航

先用"奶茶店点单机"的故事建立直觉,再用生活类比看清输入、赋值、输出的分工,最后给出三条语句的准确定义和一句方向感口诀。

故事故事引入 —— 奶茶店的"点单机"

学校旁的奶茶店新装了一台点单机,小强盯着它观察了一下午,发现它的工作其实只有三步:

第一步,听:顾客在屏幕上点下"珍珠奶茶、大杯、少冰",点单机把这些要求一条不落全收了进去;

第二步,记:屏幕上的"合计金额"先是 0 元,每加一杯就被改写一次;小黑板上的取餐号也是随时被新数字盖掉;

第三步,说:机器"叮"的一声,屏幕打出"您的取餐号是 27 号",打印机同步吐出一张小票。

"一台点单机要干活,就得先听得进、记得住、说得出。程序也一样!"

老师笑着揭秘:点单机背后藏的正是编程最基础的三个动作——输入(把数据送进程序)、赋值(把结果记进变量)、输出(把结果展示出来)。

小强一拍脑袋:原来自己写的每一行 cin、等号和 cout,就是点单机"听、记、说"的本领!

💡 这个故事告诉我们什么?

点单机之所以能工作,是因为"听、记、说"三个环节一个都不能少。程序也一样:

cin 负责"听":把键盘输入的数据读进变量;等号负责"记":把算好的结果写进变量;cout 负责"说":把结果显示到屏幕上。这三件事合起来,就是程序与外界打交道的全部基本功。

接下来的知识探究,我们就把这三条语句一个一个拆开,看清它们的"内部构造"和"数据流向"。

类比生活类比 —— 耳朵、嘴巴、小黑板与传送带

把三条语句和身边的物品对一对号,方向感一下子就清晰了:

👂

耳朵 · 点单窗口

cin 就像程序的耳朵,数据从键盘"说"进来,落进事先准备好的变量里。方向:外界 → 程序。

对应:cin >> 变量
📢

嘴巴 · 叫号屏幕

cout 就像程序的嘴巴,把变量的值一句一句"喊"到屏幕上。方向:程序 → 屏幕。

对应:cout << 内容
🧽

可擦写的小黑板

变量像一块小黑板:等号把右边算好的结果写上去,旧内容自动被擦掉,随时可以更新。

对应:变量 = 表达式
🚚

传送带

>> 和 << 都像传送带,可以一段接一段地传:cin 一次能收好几件"货",cout 一次能送好几件"货"。

对应:链式输入 / 链式输出
定义什么是输入、输出与赋值

这三条语句是 所有 C++ 程序的基本功,几乎每一道题都会用到。它们的规定如下表:

语句关键字 / 符号数据流向作用
输出语句cout <<程序 → 屏幕把数据"说"给用户看
输入语句cin >>键盘 → 变量把用户输入"听"进程序
赋值语句变量 = 表达式右边 → 左边把右边的值"记"进左边变量

注意一个贯穿本课的关键词——方向:cout 的数据流向屏幕,cin 的数据流向变量,等号右边的值流向左边。方向一旦写反,编译器会立刻报错,或者程序得到完全错误的结果。

输入输出与赋值口诀 cout 输出尖朝左,数据排队上屏幕;
cin 输入尖朝右,键盘数据进变量;
等号不是数学等,先算右边再赋左;
变量必须先声明,方向写对不慌张。

口诀里的"尖朝左、尖朝右"是本课最容易出错的地方。下面我们就把三条语句逐一拆开看清楚。

模块 02

知识探究

逐一拆解 cout、cin 与赋值语句的语法和方向,再看复合赋值与自加减的简写形式,最后用 5 个由浅入深的案例把常见写法一次练熟。

1cout 输出语句 —— 程序的"嘴巴"

cout 是 character output(字符输出)的缩写,作用是把数据送到屏幕上显示。它的标准写法是:

cout << "Hello, CSP-J!" << endl;
cout:输出器(嘴巴) <<:插入运算符,数据流向屏幕 输出内容(字符串 / 变量 / 表达式) endl:换行

使用时牢记三个要点:

要点说明示例
链式输出多个 << 可以连写,一句话输出多项内容cout << a << " " << b;
文字要加引号想原样输出的文字用双引号括起来;变量名不加引号cout << "年龄:" << age;
记得换行用 endl 或 "\n" 换行,否则下一次输出会紧贴在上一行后面cout << x << endl;
endl 换行
  • 全称 end line,读作"恩德莱恩"
  • 换行并立即刷新输出缓冲
  • 单独使用,不放在引号里
"\n" 换行
  • 转义字符,必须放在双引号内
  • 只换行,不刷新缓冲
  • 写法:cout << x << "\n";

一句话记住:cout 是嘴巴,<< 是说话的方向,说一项接一项,说完想换行就补一个 endl。

2cin 输入语句 —— 程序的"耳朵"

cin 是 character input(字符输入)的缩写,作用是等待用户在键盘上输入,并把数据存进变量。它的标准写法是:

cin >> a >> b;
cin:接收器(耳朵) >>:提取运算符,数据从键盘流向变量 接收数据的变量(必须先声明)
要点说明
先声明再读入cin >> a; 之前必须有 int a; 这样的声明,没声明的变量不能读入
只能读进变量>> 后面必须是变量,不能是表达式:cin >> a + 1; 是错的
空格 / 回车分隔cin >> a >> b; 输入 "3 5" 或先输 3 回车再输 5,效果相同
链式读入多个 >> 可以连成一行,从左到右依次读入

形象记忆:cin 就像点单窗口——顾客(键盘)把数据一件一件递进来,店员(程序)按顺序放进对应的杯子(变量)里,中间用空格或回车隔开。

3赋值语句 = —— 程序的"小黑板"

C++ 中的 = 不是数学里的等号,它叫赋值运算符,表示一个动作:先计算右边表达式的值,再存进左边的变量。数据方向永远是 右 → 左。

score = 90 + 5;
左边:必须是变量(容器) =:赋值运算符,方向 右 → 左 右边:任意表达式,先算出结果
语句执行过程结果
score = 90 + 5;先算 90 + 5 = 95,再存进 scorescore = 95
score = score + 1;取出 score 的旧值加 1,再写回 scorescore 从 95 更新为 96
a = b;把 b 的值复制一份存进 a,b 本身不变a 与 b 数值相同
记住:赋值就像在小黑板上写字——每写一个新值,旧值就被自动擦掉;左边的变量是黑板本身,右边的表达式才是要写的内容。黑板能当目标,内容不能当目标,所以 5 = a; 是错的。
4复合赋值与自增自减

"给自己加一点、减一点"的操作非常常用,C++ 为此准备了一组简写,叫 复合赋值运算符:

简写等价写法含义结果(a 原为 10)
a += 5;a = a + 5;自己加 5a = 15
a -= 3;a = a - 3;自己减 3a = 7
a *= 2;a = a * 2;自己乘 2a = 20
a /= 4;a = a / 4;自己除以 4a = 2
a %= 3;a = a % 3;自己除以 3 取余数a = 1

还有两个"超级简写"——自增 a++ 与自减 a--,分别等价于 a = a + 1; 和 a = a - 1;。它们藏在表达式里时还有微妙的差别,留到后续课程专门讲,这里先混个脸熟。

链式赋值:赋值也能"连环写"——a = b = c = 5; 执行时从右往左,先把 5 赋给 c,再赋给 b,最后赋给 a,三个变量最终都是 5。

5串起来看:一个程序的完整旅程

把三条语句串成一个小完整程序:读入两个数,算出它们的和,再输出。看着数据一步步流动:

C++两数之和程序
#include <iostream>
using namespace std;
int main(){
    int a, b;
    cin >> a >> b;      // 键盘输入:3 5
    a = a + b;          // 算出和,存进 a
    cout << a << endl;  // 输出结果
    return 0;
}

🎬 动画演示:输入 3 5 后的执行过程

1
int a, b; —— 程序准备好两个空盒子 a 和 b
2
cin >> a >> b; —— 键盘敲入的 3 和 5 分别住进 a 和 b
3
a = a + b; —— 取出 3 和 5,算出 3 + 5 = 8,写回 a(覆盖旧值 3)
4
cout << a << endl; —— 屏幕显示 8,程序完成任务!

解读:数据先由 cin 进入变量,再由赋值语句加工,最后由 cout 送到屏幕。输入 → 加工 → 输出,这就是几乎所有程序的骨架,今后的每一道题都在重复这三步。

案例5 个由浅入深的案例

案例 1:问候程序 —— 读入信息再打招呼

题目:读入年龄和学号,输出一句完整的问候语。

C++问候程序
#include <iostream>
using namespace std;
int main(){
    int age, num;
    cin >> age >> num;
    cout << "你好!你今年 " << age << " 岁,";
    cout << "学号是 " << num << "。" << endl;
    return 0;
}
键盘输入
12 27
运行结果
你好!你今年 12 岁,学号是 27。

解读:文字和变量可以在一行 cout 里交替出现——加引号的原样输出,不加引号的输出变量的值。两行 cout 连写也没问题,只要最后用 endl 换行即可。

案例 2:交换两个数 —— 赋值方向大考验

题目:a = 3,b = 7,怎样让 a 变成 7、b 变成 3?

C++借助第三个变量交换
#include <iostream>
using namespace std;
int main(){
    int a = 3, b = 7, t;
    t = a;    // t 暂存 3
    a = b;    // a 变成 7
    b = t;    // b 变成 3
    cout << a << " " << b << endl;
    return 0;
}
运行结果
7 3

变量追踪表(一步一步看值的变化):

执行到的语句abt
初始:int a = 3, b = 7, t;37空
t = a;373
a = b;773
b = t;733

解读:直接写 a = b; b = a; 是不行的——第一步执行完,a 的旧值 3 就被覆盖丢了,必须先用 t 把它"接住"。就像两杯饮料要互换,得先拿一个空杯子倒一杯。

案例 3:计分板累加器 —— 复合赋值实战

题目:模拟一块计分板:初始 80 分,答对加 5 分,失误扣 3 分,最后使用双倍卡。

C++计分板
#include <iostream>
using namespace std;
int main(){
    int score = 80;
    cout << score << endl;     // 初始分
    score += 5;               // 答对一题
    cout << score << endl;
    score -= 3;               // 失误扣分
    cout << score << endl;
    score *= 2;               // 双倍积分卡
    cout << score << endl;
    return 0;
}
运行结果
80
85
82
164

解读:score += 5; 就是 score = score + 5; 的简写。声明变量时直接写 int score = 80; 叫做 初始化——在变量"出生"的同时给它写好第一个值,这是个好习惯。

案例 4:格式化输出 —— 算式与结果一起展示

题目:输出像 "3+5=8" 这样算式与结果连在一起的式子。

C++算式输出
#include <iostream>
using namespace std;
int main(){
    int a = 3, b = 5;
    cout << a << "+" << b << "=" << a + b << endl;
    cout << a << "*" << b << "=" << a * b << "\n";
    cout << "a 大于 b 吗:" << (a > b) << endl;
    return 0;
}
运行结果
3+5=8
3*5=15
a 大于 b 吗:0

解读:cout 可以混搭输出字符串、变量和表达式——a + b 会先算出 8 再输出。第三行把 bool 比较的结果 (a > b) 直接输出,false 显示为 0,正好呼应第 2 讲学过的 bool 特性。

案例 5:现场捉虫 —— 三个方向性错误

题目:下面三行代码各藏着一只"方向虫",找出来并改正。

C++有问题的三行代码
int x, y;
cin << x;                // 第 1 行
cout >> "答案是" >> y;   // 第 2 行
5 = y;                   // 第 3 行
三只虫子
第 1 行:cin 的箭头写反了,数据没法流进变量;
第 2 行:cout 的箭头也反了,输出方向错误;
第 3 行:赋值方向反了,常数 5 不能当"容器"。
正确写法
int x, y;
cin >> x;
cout << "答案是" << y;
y = 5;

解读:这类"方向虫"是新手最高频的错误。自检口诀:箭头永远指向数据要去的地方——输入时数据去变量(尖朝变量),输出时数据去屏幕(尖朝 cout);赋值时数据去左边变量。

模块 03

实践应用

三道动手题:读代码写结果、给代码捉虫子、看要求写程序。先自己做,再点开答案对照。

实践 1 写输出

题目:跟踪变量 —— 下面程序输出什么?

C++待跟踪的程序
#include <iostream>
using namespace std;
int main(){
    int a = 3, b = 7;
    a = a + b;   // 第 1 步
    b = a - b;   // 第 2 步
    a = a - b;   // 第 3 步
    cout << a << " " << b << endl;
    return 0;
}
提示:别心算跳步!一步一步把 a、b 的新值写在纸上,注意每次赋值后旧值就被覆盖了。
点击查看参考答案
答案:7 3 —— 两个数竟然交换了!
过程:第 1 步 a = 3 + 7 = 10(此时 a=10, b=7);第 2 步 b = 10 - 7 = 3(此时 a=10, b=3);第 3 步 a = 10 - 3 = 7(此时 a=7, b=3)。
点评:这是不借助第三个变量交换两数的经典技巧。不过要当心:如果 a + b 超过 int 范围会溢出,所以竞赛中还是推荐案例 2 的临时变量写法,更稳妥。
实践 2 捉虫挑战

题目:下面这段代码藏着 3 处错误,把它们全部找出来

C++待捉虫的程序
int x;
cin >> x + 1;             // 第 1 行
cout << x << endl          // 第 2 行
cout << "完毕" >> endl;    // 第 3 行
点击查看参考答案
第 1 行:cin 的 >> 后面只能是变量,不能是表达式 x + 1。想实现"读入后加 1",应拆成两句:cin >> x; x = x + 1;
第 2 行:句尾缺少分号。C++ 中每条语句都要以 ; 结尾。
第 3 行:输出语句的箭头写反了,>> 应改为 <<:cout << "完毕" << endl;
实践 3 编程题

题目:长方形计算器 —— 读入长和宽,输出周长与面积

要求:从键盘读入两个整数 a 和 b 表示长和宽,第一行输出"周长="加结果,第二行输出"面积="加结果。

提示:周长 = 2 × (长 + 宽),面积 = 长 × 宽。先用 cin 读入,再用两条 cout 输出,别忘换行。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int a, b;
    cin >> a >> b;
    cout << "周长=" << 2 * (a + b) << endl;
    cout << "面积=" << a * b << endl;
    return 0;
}
示例:输入 4 6,输出两行:周长=20 和 面积=24。说明:cout 里可以直接放表达式 2 * (a + b),程序会先算出结果再输出,无需先存进变量。
模块 04

总结提升

把三条语句浓缩成一张表、一句口诀,再用"加 1 的一题三解"检验你是否真正理解了赋值与简写。

总结核心要点总结
语句语法格式数据方向使用要诀
cout 输出cout << 项1 << 项2 << endl;程序 → 屏幕可链式连写;文字加双引号
cin 输入cin >> 变量1 >> 变量2;键盘 → 变量先声明后读入;空格回车分隔
赋值变量 = 表达式;右 → 左左边必须是变量;先算右边
复合赋值a += b;(等价 a = a + b;)右 → 左+= -= *= /= %= 同理
自增自减a++; a--;自身 ±1是 ±1 的超级简写
输入输出与赋值口诀(再背一遍) cout 输出尖朝左,数据排队上屏幕;
cin 输入尖朝右,键盘数据进变量;
等号不是数学等,先算右边再赋左;
变量必须先声明,方向写对不慌张。
拓展拓展案例 —— 给变量加 1 的三种写法

同样是"把变量加 1",C++ 给出了三种写法,结果完全相同:

C++一题三解:加 1
#include <iostream>
using namespace std;
int main(){
    int a = 0, b = 0, c = 0;
    a = a + 1;   // 最基础:完整赋值写法
    b += 1;      // 复合赋值:简写
    c++;         // 自增:超级简写
    cout << a << " " << b << " " << c << endl;
    return 0;
}
运行结果
1 1 1

解读:三种写法殊途同归。写程序时优先用 c++ 这样的简写,简洁不易错;但读代码时看到 a = a + 1; 也要一眼认出它就是"自增"。计数、循环里会大量出现这个操作,后面学 for 循环时它会天天出场。

🧠 思考与启发

数学里的等号是对称的:a = b 和 b = a 说的是同一回事。为什么 C++ 的等号偏偏有方向,只能从右往左赋值?

提示:赋值是一个"动作",必须先算出右边表达式的值,才能把它放进左边的变量容器里。数学的等号描述的是一种"相等的状态",程序的等号描述的是"存值的动作"。分清"状态"与"动作",是从数学思维跨入编程思维的第一步。

模块 05

学习检测

5 个最容易丢分的方向性陷阱、一张考前必背速查表,以及可以贴在文具盒上的知识点速记卡。

易错 1

<< 与 >> 方向写反

输入输出语句的箭头必须指向"数据要去的地方",写反直接编译报错。

错误写法
cin << x;
cout >> "你好";
正确写法
cin >> x;
cout << "你好";
口诀:输入尖朝变量,输出尖朝屏幕,箭头永远指向数据的目的地。
易错 2

赋值左边不是变量

等号左边必须是一个变量(容器),常数或算式都不能当"黑板"。

错误写法
5 = y;
a + b = c;
正确写法
y = 5;
c = a + b;
口诀:左边变量右边算,方向反了编译断。
易错 3

把比较的 == 当成赋值 =

a == 5; 只是"比较 a 是否等于 5",并不会把 5 存进 a。一个等号和两个等号完全是两回事。

错误写法
a == 5;   // a 没有被赋值
正确写法
a = 5;    // 把 5 存进 a
口诀:单等赋值,双等比较;学到 if 判断时,双等号会天天见。
易错 4

交换两数忘记临时变量

直接写 a = b; b = a; 看似交换,其实第一步就把 a 的旧值弄丢了。

错误写法
a = b;
b = a;  // 结果 a、b 相同
正确写法
t = a;
a = b;
b = t;
口诀:两杯饮料要互换,先拿空杯接一杯。
易错 5

endl 写成 end1,\n 写成 /n

endl 的 l 是字母 L(line 的首字母),不是数字 1;换行转义符是反斜杠 \n,不是斜杠 /n。

错误写法
cout << x << end1;
cout << x << "/n";
正确写法
cout << x << endl;
cout << x << "\n";
口诀:end 加字母 L,换行反斜杠 n;拼写差一点,程序翻大跟头。
速查考前速查表
语句写法方向示例提醒
cout 输出cout << 内容;程序 → 屏幕cout << "和=" << a+b << endl;文字加引号,记得换行
cin 输入cin >> 变量;键盘 → 变量cin >> a >> b;先声明后读入
赋值变量 = 表达式;右 → 左a = b + 1;左边必须是变量
复合赋值a += b;右 → 左score += 5;等价 a = a + b;
自增自减a++; a--;自身 ±1c++;是 c = c + 1 的简写
📌知识点速记卡
方向是命根

输入 >> 的箭头指向变量,输出 << 的箭头指向屏幕;箭头永远指向数据要去的地方。

先声明后读入

cin >> a; 之前必须先有 int a; 这样的声明,否则编译报错。

空格回车分隔

cin 一次读多个数据时,用空格或回车隔开都行,按顺序逐个读入。

链式连写

cout << a << b 与 cin >> a >> b 都能无限连写,从左往右依次执行。

先算右边

赋值时先算出右边表达式的值,再存进左边变量,所以 a = a + 1 合法。

左边必须是变量

5 = x、a + b = c 都非法;常数与算式不能当"容器"。

endl 拼写

end + 字母 L(line),写成 end1 是高频手误;另一种换行写法是 "\n"。

交换用临时变量

交换 a、b 的值要借助 t:t = a; a = b; b = t; 顺序一步不能乱。

课后练习

练习作业

巩固 cin、cout 与赋值语句的方向与用法,分层练习,点击展开答案与解析。

总结练习3 道综合题
总结 1 判断题

题目:判断 —— cin >> x; 的数据流向是"从变量 x 到键盘"。

回想 cin 的角色:它是程序的耳朵,还是嘴巴?

提示:箭头 >> 指向谁,数据就流向谁。
点击查看参考答案
答案:错误。cin 是输入,数据从键盘流向变量 x。"从变量到屏幕"是 cout 的方向。
总结 2 写输出

题目:下面程序输出什么?

C++复合赋值连用
int a = 10;
a += 5;
a *= 2;
cout << a << endl;
点击查看参考答案
答案:30。a 先由 10 变为 10 + 5 = 15,再变为 15 × 2 = 30。复合赋值按书写顺序逐条执行。
总结 3 编程题

题目:读入三个整数,第一行输出它们的和,第二行输出平均数(保留小数)。

想一想:怎样避免第 2 讲学过的"整数除法丢小数"陷阱?

提示:让除数写成 3.0,平均数就会按 double 计算。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int a, b, c;
    cin >> a >> b >> c;
    int s = a + b + c;
    cout << "和=" << s << endl;
    cout << "平均数=" << s / 3.0 << endl;
    return 0;
}
示例:输入 4 5 6,输出"和=15"和"平均数=5"。注意 s / 3.0 中只要有一个是实数,结果就带小数,正好避开整数除法陷阱。
A 组基础巩固(4 题)
A1 填空题

题目:向屏幕输出内容要用对象 ______,从键盘读入数据要用对象 ______;它们都定义在头文件 ______ 中。

点击查看参考答案
C++完整参考代码
// A1:cout 负责输出、cin 负责读入,都来自 <iostream>
#include <iostream>          // ← 这里填 iostream
using namespace std;

int main()
{
    int n;
    cin >> n;                // 从键盘读入,存进 n
    cout << n << endl;       // 把 n 打印到屏幕
    return 0;
}

答案:cout;cin;<iostream>。读入前必须先用 int、double 等声明变量。

思路:方向就是数据流动方向:cin >> x 是把数据「读进来」存进 x,cout << x 是把数据「送出去」到屏幕。两者都定义在 <iostream> 头文件里。

考点:本讲「输入输出对象与 <iostream> 头文件」。

易错:方向写反成 cin << x 或 cout >> x;忘记 #include <iostream> 导致 cout 未定义;忘记先声明变量就直接 cin。

A2 判断题

题目:判断 —— a = a + 1; 表示数学意义上"a 永远等于 a + 1"。

点击查看参考答案
答案:错误。它是一个赋值动作:先算出 a + 1 的值,再存回 a,效果是让 a 在原来的基础上增加 1。等号左右不是"相等关系",而是"赋值动作"。

考点:赋值语句中的 = 表示「把右边算出的值存进左边的变量」,与数学上的等号含义完全不同。

易错:把 a = a + 1 当成数学方程去解,认为它不可能成立。

A3 写输出

题目:键盘输入 7,下面程序输出什么?

C++读入后输出
int x;
cin >> x;
cout << x * 2 << endl;
点击查看参考答案
C++完整参考代码
// A3:题目原程序
#include <iostream>
using namespace std;

int main()
{
    int x;
    cin >> x;                 // 读入 7
    cout << x * 2 << endl;    // 先算 7 * 2 = 14,再输出
    return 0;
}
// 输入:7
// 输出:14

答案:输出 14。

思路:cin >> x; 把键盘上的 7 存进 x;cout 里可以直接放表达式,程序先算出 x * 2 = 14,再把结果打印出来。

考点:本讲「cin 读入 + cout 输出表达式的值」。

易错:以为 cout 会原样打印 x * 2 这串文字(不加引号的都会被当成表达式计算);>> 方向写错导致读入失败,x 是随机值。

A4 编程题

题目:读入两个整数,按"和=结果"的格式输出它们的和。

提示:示例输入 3 5 时,应输出"和=8"。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int a, b;
    cin >> a >> b;
    cout << "和=" << a + b << endl;
    return 0;
}
说明:"和=" 加引号原样输出,a + b 不加引号,程序先算出结果再输出。

思路:用 cin 依次读入两个整数,引号里的 "和=" 原样输出,a + b 不加引号交给计算机算。

易错:把 a + b 也用引号括起来,结果原样打印出 a+b,而不是算出的和。

B 组能力提高(4 题)
B1 写输出

题目:键盘输入"1 2 3",下面程序输出什么?

C++链式读入
int a, b, c;
cin >> a >> b >> c;
cout << a + b + c << endl;
点击查看参考答案
C++完整参考代码
// B1:题目原程序
#include <iostream>
using namespace std;

int main()
{
    int a, b, c;
    cin >> a >> b >> c;          // 依次读入 1、2、3
    cout << a + b + c << endl;   // 1 + 2 + 3 = 6
    return 0;
}
// 输入:1 2 3
// 输出:6

答案:输出 6。

思路:cin >> a >> b >> c; 按从左到右的顺序,把 1、2、3 依次存进 a、b、c;再算 1 + 2 + 3 = 6。链式读入时,输入的数字用空格或回车分隔都可以。

考点:本讲「链式读入」——一个 cin 可以连续读多个数据。

易错:以为要写三次 cin;担心输入必须严格用空格隔开;或只读入了两个变量就算加法,第三个是随机值。

B2 推理题

题目:执行 char ch; cin >> ch; 时,如果键盘输入"AB"再按回车,ch 里存的是什么?

提示:cin 读入一个 char 时,一次只取一个字符。
点击查看参考答案
答案:ch 里存的是字符 'A'。cin 读入 char 时只取第一个非空白字符,剩下的 'B' 还留在输入缓冲里,会被后面的读入语句捡走。这个小细节在混合读入字符和数字时要格外小心。

思路:cin 读入 char 时只取第一个非空白字符,多余的字符会留在输入缓冲区里。

易错:以为 ch 里存的是整个 "AB";或先读数字再读字符时,残留的换行符被当成字符读走。

B3 编程题

题目:读入两个整数 a 和 b,交换它们的值后输出。

要求使用临时变量完成交换,输出一行两个数,中间有空格。

点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int a, b, t;
    cin >> a >> b;
    t = a;
    a = b;
    b = t;
    cout << a << " " << b << endl;
    return 0;
}
示例:输入 3 7,输出 7 3。三步交换的顺序不能调换,第一步必须先存 a 的旧值。

思路:借用第三个变量 t 先把 a 的旧值保存下来,再依次覆盖,交换才不丢数据。

易错:直接写 a = b; b = a; 两步之后 a 和 b 都变成了原来的 b,原来的 a 值丢失。

B4 写输出

题目:下面程序输出什么?

C++复合赋值连环
int a = 20;
a -= 5;
a /= 3;
a *= 2;
cout << a << endl;
点击查看参考答案
C++完整参考代码
// B4:题目原程序,逐步跟踪 a 的变化
#include <iostream>
using namespace std;

int main()
{
    int a = 20;
    a -= 5;         // 20 - 5 = 15
    a /= 3;         // 15 / 3 = 5(整除,正好除尽)
    a *= 2;         // 5 * 2 = 10
    cout << a << endl;
    return 0;
}
// 输出:10

答案:输出 10。

思路:复合赋值都是「先算右边、再存回左边」,逐步跟踪即可:a -= 5 → 15;a /= 3 → 5(整数除法,正好除尽);a *= 2 → 10。逐步跟踪是这类题的通解。

考点:本讲「复合赋值运算符 -= /= *=」。

易错:把 a /= 3 当成小数除法算成 5.0;或误以为整除一定精确——若换个数据,16 / 3 会截断成 5 而不是 5.33。

C 组思维挑战(4 题)
C1 挑战题

题目:不用第三个变量,交换 a = 3 与 b = 7 的值。

提示:可以利用加减法"先合后分"。

点击查看参考答案
C++无临时变量交换
a = a + b;   // a = 10(装着 3 和 7 的和)
b = a - b;   // b = 10 - 7 = 3
a = a - b;   // a = 10 - 3 = 7
说明:先把两数之和存进 a,再一步步"减回"对方。注意风险:如果 a、b 都很大,a + b 可能超过 int 范围发生溢出,所以竞赛里仍推荐用临时变量的写法。

思路:先把 a + b 的和暂存在 a 里,再用减法一步步「减回」对方,就不用额外变量了。

C2 陷阱题

题目:下面这行代码输出什么?

C++优先级陷阱
cout << "1+2=" << 1 + 2 << endl;
点击查看参考答案
答案:1+2=3。因为算术运算符 + 的优先级高于 <<,程序先算出 1 + 2 = 3,再交给 cout 输出。如果想原样输出 "1+2=1+2",就得把 "1+2" 用双引号括成字符串。

考点:算术运算符 + 的优先级高于输出运算符 <<,所以程序先算加法再输出。

易错:以为 cout << 1+2 会把 1+2 原样打印出来。

C3 编程题

题目:读入一个四位数,输出它各位数字之和。

例如输入 1234,输出 10(1 + 2 + 3 + 4 = 10)。

提示:n % 10 能取出个位数字,n / 10 能砍掉个位;反复四次就能拆出所有数位。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int n, s = 0;
    cin >> n;
    s += n % 10;  n /= 10;
    s += n % 10;  n /= 10;
    s += n % 10;  n /= 10;
    s += n % 10;
    cout << s << endl;
    return 0;
}
说明:这道题把第 2 讲的整数除法和第 3 讲的复合赋值串在一起:每次用 % 10 取个位、用 / 10 砍个位,四次正好拆完一个四位数。学到循环后,几行重复的代码还能进一步压缩。

思路:反复用 % 10 取出末位、用 / 10 去掉末位,四次就能覆盖四位数的每一位。

易错:忘记写 n /= 10 造成死循环或重复累加同一位;取位顺序写反导致某一位被漏掉。

C4 综合题

题目:成绩单生成器 —— 读入语文、数学、英语三科成绩,用一条 cout 语句输出总分和平均分。

要求:输出格式为"总分=264 平均分=88"(一行内完成,平均分保留小数)。

提示:把 (语+数+英) 加上括号再除以 3.0;一条 cout 里用多个 << 链式拼接。
点击查看参考答案
C++参考代码
#include <iostream>
using namespace std;
int main(){
    int c, m, e;
    cin >> c >> m >> e;
    cout << "总分=" << c + m + e
         << " 平均分=" << (c + m + e) / 3.0 << endl;
    return 0;
}
示例:输入 88 90 86,输出"总分=264 平均分=88"。(c + m + e) 加括号确保先求和,除以 3.0 保证结果带小数。一条 cout 链式输出,正是本课"链式写法"的综合运用。

思路:先求总分,平均分除以 3.0 才能保留小数部分。

易错:平均分写成 (c+m+e)/3,两个整数相除结果被截断,小数部分全部丢失。