
变量定义必须带类型,不能像Python那样省略
C++是静态类型语言,声明变量时必须明确写出类型,编译器不会推断(除非用auto,但那是进阶用法,新手先别碰)。写成int x = 42;是对的,x = 42;会直接报错error: 'x' was not declared in this scope。
常见错误现象:
- 复制Python/JS代码习惯,漏写类型,编译失败
- 把变量名拼错,比如
inr x = 10;(少了个t),报错error: 'inr' does not name a type - 在函数外定义但没初始化,又用了未定义行为(比如读取未初始化的
int),结果随机
实操建议:
- 定义即初始化,尤其局部变量:
int count = 0;比int count;更安全 - 变量名用有意义的英文,避免
a、tmp这类模糊命名 - 不要在头文件里定义变量(除非加
extern或inline),否则链接时报multiple definition
基本数据类型就那几个,大小和符号性得记牢
C++标准不规定int一定是4字节,只规定它至少和short一样大、至多和long一样大。实际中常见的是int为4字节,但嵌入式或Windows LLP64下可能不同。别硬背“int是4字节”,要看平台和编译器。
立即学习“C++免费学习笔记(深入)”;
关键类型清单(常用且可移植):
-
bool:取值true/false,通常1字节 -
char:1字节,有符号还是无符号取决于编译器(可用signed char或unsigned char显式指定) -
short、int、long、long long:都是有符号整型,对应无符号版加unsigned前缀(如unsigned int) -
float、double、long double:浮点类型,精度和范围递增
容易踩的坑:
- 用
int存文件大小或内存地址——超2GB就溢出,该用size_t或uint64_t - 把
char当数字用却忘了它可能是负数(比如char c = 0xFF;在有符号环境下是-1) - 比较
float是否相等用==,结果常为false——该用fabs(a - b)
别乱用typedef和using掩盖类型本质
新手看到别人用typedef unsigned long long ull;,就跟着写一堆缩写,结果读代码时根本看不出ull是整型还是指针。这不是简化,是埋雷。
实操建议:
- 只对真正冗长且稳定不变的类型做别名,比如
using byte = unsigned char; - 避免给基本类型起花哨名字:
typedef int score_t;毫无必要,反而干扰阅读 - 跨平台项目优先用
<cstdint>里的确定宽度类型:int32_t、uint8_t,比long可靠得多
性能影响几乎为零,但可读性和维护成本差别很大——别人看你代码第一眼就得猜idx是int还是size_t,这不值得。
初始化方式不止=,括号和花括号有区别
写int x = 5;、int x(5);、int x{5};都能初始化,但语义不同。最安全的是花括号初始化(uniform initialization),它禁止窄化转换。
示例对比:
int x1 = 3.14; // OK,隐式截断为3
int x2(3.14); // OK,同样截断
int x3{3.14}; // 错误!narrowing conversion使用场景建议:
- 普通变量、类成员:优先用
{},能早发现类型问题 - 调用构造函数时,
vector<int> v{1,2,3};是初始化列表,vector<int> v(10, 42);是10个42——括号和花括号含义完全不同 - 函数返回值或模板参数推导时,
auto x = {1};推成std::initializer_list<int>,不是int,这点极容易忽略
类型系统本身不复杂,但初始化语法的歧义和隐式转换才是新手掉坑最多的地方。盯住编译器警告,尤其是-Wnarrowing,比死记规则管用。










