
《计算机程序设计》
计算机学院计算机研究所编译系统研究室
~/course~/course/main.cppmain.cpp,随堂编程练习的代码请直接在此文件中编辑测一测
C/C++程序的开发过程是?
编程求解
轰炸机在高度\(h=5000m\)处朝向目标以速度\(v=200m/s\)匀速飞行,设重力加速度\(g=9.8m/s^2\)为常数,忽略空气阻力,求给定时间后投弹点的位置\((x,y)\),结果仅保留整数部分

学习目标
运用本次课所学内容,完成炸弹轨迹问题的求解!
考考你
C++标识符的构成规则与Python是否相同?

测一测
下列哪些是合法的C++标识符?
考考你
若地址使用32位整数表示,则系统最大支持多大的内存?
基础数据(整型数、浮点数、字符等)在内存中通常存储为连续的字节
C++ 定义了一个简单而完备的基础类型系统
signed char/unsigned char 分别表示有符号/无符号字符类型char是否有符号,与硬件平台与编译器实现相关考考你
一个C++字符最多可编码多少个字符?

bool用于表示逻辑值,即“真”或“假”
true和falseC++布尔类型
考考你
在布尔类型及其逻辑运算的支持方面,C++与Python有何异同?
short、int、long和long long四类signed与无符号两类unsigned
考考你
C++类型系统中,整数类型的长度与平台相关,这样的设计好吗?
温馨提示
整数类型的长度与平台相关,若需要跨平台的整数类型定义,C++标准库在cstdint中定义了长度明确的整数类型
int8_t/int16_t/int32_t/int64_tuint8_t/uint16_t/uint32_t/uint64_tfloat、双精度double与扩展精度long doublesizeof操作符获取alignof操作符获取primitive-type-size-align.cpp
cout << setw(12) << "" << setw(8) << "size" << setw(8) << "align" << '\n';
cout << setw(12) << "bool" << setw(8) << sizeof(bool) <<setw(8) << alignof(bool) << '\n';
cout << setw(12) << "char" << setw(8) << sizeof(char) <<setw(8) << alignof(char) << '\n';
cout << setw(12) << "short" << setw(8) << sizeof(short) <<setw(8) << alignof(short) << '\n';
cout << setw(12) << "int" << setw(8) << sizeof(int) <<setw(8) << alignof(int) << '\n';
cout << setw(12) << "long" << setw(8) << sizeof(long) <<setw(8) << alignof(long) << '\n';
cout << setw(12) << "long long" << setw(8) << sizeof(long long) <<setw(8) << alignof(long long) << '\n';
cout << setw(12) << "float" << setw(8) << sizeof(float) <<setw(8) << alignof(float) << '\n';
cout << setw(12) << "double" << setw(8) << sizeof(double) <<setw(8) << alignof(double) << '\n';
cout << setw(12) << "long double" << setw(8) << sizeof(long double) <<setw(8) << alignof(long double) << '\n';整型与浮点类型的取值范围是有限的,浮点类型的精度也是有限的
primitive-type-limits.cpp
cout << setw(12) << "" << setw(24) << "min" << setw(24) << "max" << '\n';
cout << setw(12) << "char" << setw(24) << SCHAR_MIN <<setw(24) << SCHAR_MAX << '\n';
cout << setw(12) << "short" << setw(24) << SHRT_MIN <<setw(24) << SHRT_MAX << '\n';
cout << setw(12) << "int" << setw(24) << INT_MIN <<setw(24) << INT_MAX << '\n';
cout << setw(12) << "long" << setw(24) << LONG_MIN <<setw(24) << LONG_MAX << '\n';
cout << setw(12) << "long long" << setw(24) << LLONG_MIN <<setw(24) << LLONG_MAX << '\n';
cout << setw(12) << "float" << setw(24) << FLT_MIN <<setw(24) << FLT_MAX << '\n';
cout << setw(12) << "double" << setw(24) << DBL_MIN <<setw(24) << DBL_MAX << '\n';
cout << setw(12) << "long double" << setw(24) << LDBL_MIN <<setw(24) << LDBL_MAX << '\n';测一测
测一测
下面的程序会输出什么?
考考你
与Python不同,C++类型系统中,有不同长度的整数与浮点数类型,这是为什么?二者各有何优劣?
考考你
如下积分公式中,常量和变量分别是?
\[\int_3^t f(x)dx\]
---
config:
look: handDrawn
themeVariables:
fontSize: 20px
---
mindmap
Root(变量)
变量名:标识符
类型:数据类型
值:存储的数据
地址:内存中的位置
作用域:变量的可见范围
生存周期:变量的有效时间
属性一:变量名
aGoodeName, heightOfTreelovely_students, stupid_teacher属性二:类型
考考你
内存中变量c和s之间为什么有一个“洞”?声明一个变量但不做初始化,这个变量的值是什么?
属性三:值
属性四:地址
明察秋毫:地址与值
属性四/五:生存周期/作用域
且听下回分解!
常量分为字面量和符号常量
常量的类别
| 进制 | 示例 | 说明 |
|---|---|---|
| 十进制 | 789 | 非0前缀的十进制整数字面量 |
| 八进制 | 0123 | 0前缀的八进制整数字面量 |
| 十六进制 | 0xFF | 0x/0X前缀的十六进制整数字面量 |
考考你
C++八进制整数字面量写法与Python有何区别?
| 后缀 | 示例 | 说明 |
|---|---|---|
| 123 | int |
|
| u | 123u | unsigned int |
| l | 123l | long |
| ll | 123ll | long long |
| ul | 123ul | unsigned long |
| ull | 123ull | unsigned long long |
const关键字修饰温馨提示
建议常量采用全大写命名,如PI、NUM_CPUS
测一测
下列哪些是合法的C++字符串?
"Hello World!"'Pretty cool!'"I'm a student.""A "孙悟空" style hero"考考你
请定义炸弹轨迹问题中的常量与变量
轰炸机在高度\(h=5000m\)处朝向目标以速度\(v=200m/s\)匀速飞行,设重力加速度\(g=9.8m/s^2\)为常数,忽略空气阻力,求给定时间后投弹点的位置\((x,y)\),结果仅保留整数部分
x、1.2e10x+y、a*3(int)2.3sin(x)---
config:
look: handDrawn
themeVariables:
fontSize: 20px
---
mindmap
Root(表达式)
类型
值
3、'c'、1e-2、"hello"、truePIx、radiusx+y、a*3~a、a && bsin(x)、printf("Hello")注意
复合表达式中的操作数本身亦须是表达式
---
config:
look: handDrawn
themeVariables:
fontSize: 28px
---
flowchart LR
表达式 --> 基本表达式
表达式 --> 复合表达式
基本表达式 --> 常量
基本表达式 --> 变量
复合表达式 --> 运算符
复合表达式 --> 类型转换
复合表达式 --> 函数调用
+、-、*、/、%&&、||、!==、!=、>、<、>=、<=&、|、^、~、<<、>>=、+=、-=、*=++、--,? :sizeof、new
a+b*c等价于a+(b*c)a+b-c等价于(a+b)-ca=b+=1等价于a=(b+=1)!!a等价于!(!a)教员箴言
用括号,让自己清楚,让别人明白!

+)、减(-)、乘(*)、除(/)以及模(%)
明察秋毫
\[a = (a/b) \cdot b + a\%b\]
==)、不等于(!=)>)、大于等于(>=)、小于(<)、小于等于(<=)true转换成1,false转换成0&)、按位或(|)、按位异或(^)以及按位取反(~)& |
1 | 0 |
|---|---|---|
| 1 | 1 | 0 |
| 0 | 0 | 0 |
| |
1 | 0 |
|---|---|---|
| 1 | 1 | 1 |
| 0 | 1 | 0 |
~ |
1 | 0 |
|---|---|---|
| 0 | 1 |
^ |
1 | 0 |
|---|---|---|
| 1 | 0 | 1 |
| 0 | 1 | 0 |
<<)与右移位(>>)
&&/and)||/or)!/not)| and | true |
false |
|---|---|---|
true |
true |
false |
false |
false |
false |
| or | true |
false |
|---|---|---|
true |
true |
true |
false |
true |
false |
| not | true |
false |
|---|---|---|
false |
true |
a+=2等价于a=a+2+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=++)或减 1(--)的操作,有两个变种
a++与a--的值是增(减)1后的值++a与--a的值是增(减)1前的值自增/自减运算
明察秋毫
a++与a--在副作用上等同于a+=1与a-=1,但是在表达式值上有所不同
b ? x : y
bb为真,则计算表达式x作为条件表达式的值y作为条件表达式的值明察秋毫
在b ? x : y中,x与y有且仅有一个会被计算
a和b的值分别为3和5,则表达式(a, b+3, b+a)的值为8搞事?
这鬼运算符有啥用?
for循环中初始化多个变量教员箴言
不要玩花活,除了少数惯用法,应当尽量避免逗号运算符的使用
x为真,则x || y的值为真,不会计算yx为假,则x && y的值为假,不会计算y逻辑表达式短路
明察秋毫
短路是语言规范的行为,而非一种优化
C++运算符
考考你
哪些应用场景需要用到类型转换?
---
config:
look: handDrawn
themeVariables:
fontSize: 28px
---
flowchart TD
类型转换 --> 隐式转换
类型转换 --> 显式转换
static_cast<type>(expr)(type)expr显式类型转换
inttrue转换为1,false转换为0false,非0转换为true避坑
当将高精度、范围大的数据类型转成低精度、范围小的数据类型时可能会造成精度损失或数值溢出
1996年,欧洲航天局Ariane 5火箭首飞,火箭升空约40秒后解体爆炸。调查报告显示,事故原因源自控制程序中一个将64位浮点数转换为16位整型的语句,该语句未进行合理数值溢出处理
——The Worst Computer Bugs in History

考考你
下面的表达式是什么类型?
(1)3.14f + 2 (2)3.14 + 2.0f (3)1 && 2 (4)1 ^ 2 (5)true ^ false
考考你
请完成炸弹轨迹问题中的计算过程
轰炸机在高度\(h=5000m\)处朝向目标以速度\(v=200m/s\)匀速飞行,设重力加速度\(g=9.8m/s^2\)为常数,忽略空气阻力,求给定时间后投弹点的位置\((x,y)\),结果仅保留整数部分
cout:标准输出流,即显示器cin:标准输入流,即键盘iostream头文件明察秋毫
cout和cin的功能相当于Python中的print和input函数
<<)和提取运算符(>>)进行输出与输入
<<)用于将数据插入到输出流中>>)用于从输入流中提取数据标注输入输出流
明察秋毫
<<和>>除了是流操作符,还是移位运算符,具体使用场景通过上下文区分
考考你
请完成炸弹轨迹问题中的输入与输出
轰炸机在高度\(h=5000m\)处朝向目标以速度\(v=200m/s\)匀速飞行,设重力加速度\(g=9.8m/s^2\)为常数,忽略空气阻力,求给定时间后投弹点的位置\((x,y)\),结果仅保留整数部分
---
config:
look: handDrawn
themeVariables:
fontSize: 20px
---
mindmap
C++语言基础
标识符
关键字
类型系统
基础数据类型
字符类型
整型
浮点型
布尔型
长度与对齐
取值范围
变量与常量
变量
常量
符号常量
字面量
表达式
运算符
算术运算
逻辑运算
短路
关系运算
位运算
赋值运算
自增自减运算
条件运算
逗号运算
类型转换
显式类型转换
隐式类型转换
输入输出
标准输入输出流
学习目标
计算机程序设计
