语法细节
Quote
“魔鬼藏在细节里,bug 也藏在细节里。”
Tip
下面是我刷题过程中遇到的一些语法细节我没注意,但是往往是这一个个细节决定你代码是否能跑得通,《道德经》有言“天下难事,必作于易;天下大事,必作于细。”,所以以下是我对于某些我不熟悉语法的归纳。排序不分先后。
1.C++ 数组是否自动初始化为 0
很多人误以为:
定义出来默认就是 0。这个理解不对。
变量是否自动初始化,与 int、long long、数组类型无关,取决于变量定义的位置(存储期)。
函数内部定义的局部变量:
数组元素默认是未定义值(垃圾值),直接使用可能导致结果错误。
函数外定义的全局变量:
会自动初始化为 0。
加 static 的变量:
也会自动初始化为 0。
很多初学者之所以误会,是因为某些编译器或调试环境碰巧把局部内存清零了,但这不是 C++ 语言保证,换平台后可能直接出错。
竞赛中最常见问题是动态规划数组没初始化:
此时 dp[i] 初始值是垃圾值,答案会错。
正确写法:
或:
记忆一句话:
2.C++ 三目运算符(?:)与“比较写法”
三目运算符是 C++ 中常用的简化判断表达式:
含义是:如果 a 为真,取 b,否则取 c。
常见用途(代替 if-else)
等价于:
易错点 1:嵌套三目可读性差
虽然能用,但非常难读,建议改用 if。
易错点 2:误把三目当“if语句”
三目是表达式,不是语句,必须有返回值。
❌ 错误:
虽然能编译,但不推荐(副作用写法)。
易错点 3:返回类型被“统一转换”
三目运算符结果类型会自动统一:
结果是 1.0 → 再转 int → 1(可能发生隐式转换)
易错点 4:优先级坑
等价于:
但如果不加括号容易误读。
常见应用场景
- 取最大 / 最小
- 简单条件赋值
- inline 表达式简化
三目运算符的嵌套
详细见洛谷6_1求细胞数量最后我自己的做法一句话总结
3. 整数转化为字符串
Danger
但是这两种方法对于10以上的数字就会出问题,
string s =1+'0';本质上是 ASCII 码值的计算,而ASCII 码值没有11,12...诸如此类
错误代码
错误原因 1.int + char 运算后结果为 int(ASCII 数值运算);
2. C++ 不支持 int 直接赋值给 string,类型不匹配编译报错;
3. i+'0' 仅适用于 0~9 单个数字,大数会乱码。
正确写法
to_string方法在头文件#include <string>中
- 任意数字转字符串(推荐)
- 单个数字 0~9 专用 核心口诀 数加字符变整数,整型不可赋字符串; 多位数字用to_string,单数字加零转字符。
4. memset()函数的使用
**C++ `memset` 知识卡片(简洁版)**
memset:按字节给一段内存批量赋值,常用于数组初始化。
常用写法
int a[100];
memset(a, 0, sizeof(a)); // 全部置 0
memset(a, -1, sizeof(a)); // 全部置 -1
memset(a, 0x3f, sizeof(a)); // 设为大整数(常作 INF)
为什么 memset(a,1,...) 不行?
因为它按字节填充:
一个 int 会变成:
不是 1。
适用场景
数组清零、标记数组、二维数组初始化都很常用。
不适用场景
这些是对象类型,不要用 memset。
一句话记忆
memset是按字节赋值。
所以: