基础数据变量

内容简介

变量是程序保存数据的基本单位,类型决定变量能保存什么值、占多少内存、能参与哪些运算。C/C++ 是静态类型语言,变量通常要先声明类型再使用。

本篇只建立主线概念:变量、基础类型、初始化、字面量和作用域。类型转换、size_t、固定宽度整数放到 CandCpp数据变量进阶;C 语言更细的整型提升、有符号/无符号转换规则放到 C语言类型转换规则

用法

常见基础类型

类型含义常见大小
char字符或小整数1 字节
short较短整数通常 2 字节
int常用整数通常 4 字节
long长整数平台相关
long long更长整数至少 8 字节
float单精度浮点数通常 4 字节
double双精度浮点数通常 8 字节
bool布尔值,C++ 内置,C99 需 <stdbool.h>通常 1 字节
void无类型,常用于函数无返回值或 void*不用于定义普通变量
int age = 18;
double score = 95.5;
char level = 'A';
#include <string>
 
bool passed = true;
std::string name = "Alice";

声明、定义和初始化

int count = 0;       // 定义并初始化
extern int total;    // 声明:total 在别处定义

局部变量如果没有初始化,读取它是未定义行为。

int value;
/* printf("%d\n", value);  错误:value 未初始化 */

整数字面量

int decimal = 100;     // 十进制
int hex = 0xFF;        // 十六进制
int octal = 067;       // 八进制
int binary = 0b1010;   // 二进制:C++14 标准支持,C 中常见编译器扩展

字符和字符串

char ch = 'A';
char text[] = "Hello";  // 实际包含 'H' 'e' 'l' 'l' 'o' '\0'
#include <string>
 
std::string text = "Hello";

作用域和生命周期

int global_count = 0;     // 文件作用域,静态存储期
 
int main(void)
{
    int local_count = 0;  // 块作用域,自动存储期
    return 0;
}

基础阶段先理解全局变量和局部变量。staticexternvolatile 等更细规则见 C语言存储类型

最佳代码实践

  • 变量定义时尽量初始化,避免读到未定义值。
  • 用有意义的变量名,例如 student_countn 更容易维护。
  • C++ 字符串优先使用 std::string,动态数组优先使用 std::vector
  • 需要明确大小时使用 <stdint.h> / <cstdint> 中的 int32_tuint64_t 等类型。
  • 需要表达大小、长度、字节数时使用 size_t / std::size_t
  • 浮点数比较不要直接用 ==,应比较误差范围。
double a = 0.1 + 0.2;
double b = 0.3;
if (std::abs(a - b) < 1e-9) {
    // 认为相等
}

错误用法

int value;
printf("%d\n", value);  // 错误:value 未初始化
char text[5] = "hello";  // 错误:缺少字符串结尾的 '\0' 空间
int 1age = 18;  // 错误:变量名不能以数字开头
int float = 1;  // 错误:不能使用关键字作变量名
int value = 23.9;  // 错误倾向:小数部分被截断

注意事项

  • char 是否有符号与编译器有关,需要明确时写 signed charunsigned char
  • long 的大小在不同平台可能不同,不要假设它一定是 8 字节。
  • C 语言没有内置 bool,C99 可通过 #include <stdbool.h> 使用 bool
  • void main() 不是标准写法,入口函数推荐写 int main(void)int main()
  • 表达式计算中的自动转换很重要,但不适合堆在入门主线里,细节见 C语言类型转换规则

更多:CandCpp数据变量进阶C语言类型转换规则

学习路径