视频
注意
文稿与视频实际内容可能存在出入,以视频为准
关于评论区的一些评论
很少能看到这么正确的
科普视频,居然用的是
devcpp
本来是想用VSCode的,但是我当时忘记了就用Devc++
都是基本功,还算可以。不过工程上极度不推荐用这个万能头文件和
using namespace std 虽然大概率你是打
算法竞赛的,不太可能会重视这种东西。
是OI
文稿
1. 变量初始化之谜
cpp
#include <iostream>
using namespace std;
int main() {
int x;
cout << "未初始化的x = " << x << endl;
return 0;
}功能:演示未初始化局部变量的行为
你以为是确定性的0吗?
实际上是随机垃圾值的!
原理:局部变量在栈上分配,不会自动初始化,值是之前使用该内存的残留数据
2. 浮点数精度陷阱
cpp
#include <iostream>
using namespace std;
int main() {
double a = 0.1;
double b = 0.2;
double c = 0.3;
cout << "0.1 + 0.2 == 0.3 ? " << (a + b == c) << endl;
cout << "实际值: " << a + b << endl;
return 0;
}功能:验证浮点数精度问题
你以为是精确相等的吗?
实际上是不相等的!
原理:浮点数在二进制中无法精确表示0.1、0.2这样的十进制小数,存在精度误差
3. 数组越界不报错
cpp
#include <iostream>
using namespace std;
int main() {
int arr[3] = {1, 2, 3};
cout << "arr[5] = " << arr[5] << endl;
cout << "程序还在运行!" << endl;
return 0;
}功能:测试数组越界访问的行为
你以为是会崩溃的吗?
实际上是可能正常输出的!
原理:C++不检查数组边界,越界访问是未定义行为,可能读到随机内存值而不崩溃
4. 布尔值的算术运算
cpp
#include <iostream>
using namespace std;
int main() {
bool b = true;
cout << "b + 5 = " << (b + 5) << endl;
cout << "b * 10 = " << (b * 10) << endl;
return 0;
}功能:展示bool类型在算术运算中的行为
你以为是true/false的吗?
实际上是1/0参与运算的!
原理:bool在算术运算中会隐式转换为int,true为1,false为0
5. 自增运算符的迷惑行为
cpp
#include <iostream>
using namespace std;
int main() {
int i = 5;
int j = i++ + ++i;
cout << "j = " << j << endl;
return 0;
}功能:演示序列点问题
你以为是确定结果的吗?
实际上是编译器随缘的!
原理:同一表达式中对同一变量多次修改是未定义行为,结果取决于编译器实现
6. 空结构体的大小
cpp
#include <iostream>
using namespace std;
struct Empty {};
int main() {
cout << "空结构体大小: " << sizeof(Empty) << endl;
return 0;
}功能:探究空结构体的内存占用
你以为是0字节的吗?
实际上是1字节的!
原理:为了确保每个对象都有唯一地址,空结构体被分配1字节大小
7. const变量的"不可修改"
cpp
#include <iostream>
using namespace std;
int main() {
const int x = 10;
int* p = const_cast<int*>(&x);
*p = 20;
cout << "x = " << x << endl;
cout << "*p = " << *p << endl;
return 0;
}功能:测试const_cast的能力和限制
你以为是真正不可变的吗?
实际上是可以绕过的!
原理:const_cast可以移除const属性,但修改const对象是未定义行为
此处评论已关闭