2、C++基础语法(上):变量与数据类型

各位同学,咱们今天正式进入C++的语法世界。说实话,每次带新人入门,我都要强调一个观点:基础语法就像盖房子的地基,看着简单,但决定了你后面能盖多高。我自己刚学C++那会儿,总觉得变量声明不就是写个类型加名字嘛,有啥好学的?结果后来在项目里被一个隐式类型转换坑得加班到凌晨两点……嗯,从那以后我再也不敢小看这些基础了。

2.1 变量:程序里的“收纳盒”

变量是什么?说白了就是一块内存空间,我们给它起了个名字,用来存数据。你想想看,程序运行的时候要处理各种信息——用户的年龄、商品的价格、开关的状态……这些都得有个地方放,变量就是干这个的。

声明一个变量的语法很简单:

数据类型 变量名 = 初始值;

举个例子:

int age = 25;          // 整型,存年龄
float price = 99.9;    // 浮点型,存价格
char grade = 'A';      // 字符型,存等级
bool isLogin = true;   // 布尔型,存真假

我个人习惯在声明变量时就给初始值。为什么?因为未初始化的变量里面是垃圾值,我曾经在调试一个支付系统时,发现某个变量没初始化,结果在不同环境下跑出不同的结果,排查了整整一个下午……

注意:C++不会自动初始化局部变量。如果你写了 int x; 然后直接用,x的值是不确定的。这绝对是个坑,我建议你养成“声明即初始化”的习惯。

2.2 基本数据类型详解

C++提供了几种基本数据类型,咱们一个一个来看。

int(整型)

用来存整数,比如人数、次数、ID号。在大多数平台上占4个字节,范围大约是 -21亿 到 21亿。

int count = 100;
int score = -5;

如果你确定数值不会为负,可以用 unsigned int,范围能翻倍:

unsigned int positive = 3000;  // 只能存非负数

float / double(浮点型)

存带小数点的数。float是单精度(7位有效数字),double是双精度(15位有效数字)。我一般默认用double,精度更高,而且现在内存也不差那4个字节。

float pi = 3.14f;       // 注意后面的f,告诉编译器这是float
double precise = 3.1415926535;
小技巧:比较两个浮点数是否相等时,千万别直接用 ==。因为浮点数有精度误差。我通常用 fabs(a - b) < 1e-6 这种方式来判断。

char(字符型)

存单个字符,用单引号括起来。实际上char存的是字符的ASCII码值,所以它本质上也是个整数。

char ch = 'A';          // 实际存的是65
char digit = '9';       // 实际存的是57

我记得有一次做串口通信协议解析,需要把接收到的字节转成对应的控制指令。当时就是利用char和int之间的转换关系,写了个很简洁的解析函数。

bool(布尔型)

只有两个值:truefalse。在C++里,true相当于1,false相当于0。

bool isFinished = false;
bool hasError = true;

你想想看,写条件判断的时候,用bool变量比用0/1要清晰得多。代码的可读性就是这么一点一点提升的。

2.3 常量:不变的值

有些数据在程序运行过程中不应该被修改,比如圆周率、最大连接数、配置参数等。这时候就用常量。

C++里定义常量有两种方式:

// 方式一:使用 #define 宏定义(C语言风格)
#define MAX_SIZE 100

// 方式二:使用 const 关键字(C++推荐)
const double PI = 3.1415926;
const int MAX_CONNECTIONS = 1024;

我个人强烈推荐用 const。为什么?因为 #define 只是简单的文本替换,不进行类型检查,出了问题很难排查。我见过一个项目,用 #define MAX 100+20,结果写 int x = MAX * 2; 的时候,实际展开成了 100+20*2,结果完全不对……

核心原则:能用 const 就别用 #define。const 有类型、有作用域、能被编译器检查,安全得多。

2.4 输入输出:cin 和 cout

程序要和用户交互,就得有输入输出。C++用 cincout,它们定义在 <iostream> 头文件中。

#include <iostream>
using namespace std;

int main() {
    int age;
    cout << "请输入你的年龄:";
    cin >> age;
    cout << "你的年龄是:" << age << endl;
    return 0;
}

这里有几个要点:

  • cout << 是输出,<< 叫“插入运算符”
  • cin >> 是输入,>> 叫“提取运算符”
  • endl 是换行,相当于 \n
  • using namespace std; 是为了不用每次都写 std::cout
注意:cin 在读取时会跳过空白字符(空格、换行、制表符)。如果你要读取带空格的字符串,需要用 getline()。这个后面讲字符串的时候再细说。

2.5 运算符:让数据动起来

有了数据,接下来就是操作数据。C++提供了三大类运算符。

算术运算符

就是加减乘除这些:

int a = 10, b = 3;
int sum = a + b;      // 13
int diff = a - b;     // 7
int prod = a * b;     // 30
int quot = a / b;     // 3(整数除法,舍去小数)
int rem = a % b;      // 1(取余数)

这里有个坑:整数除法会截断小数部分。如果你想要小数结果,至少让其中一个操作数是浮点数:

double result = 10.0 / 3;   // 3.33333

关系运算符

用来比较两个值,结果是一个bool值:

运算符含义示例结果
==等于5 == 5true
!=不等于5 != 3true
>大于5 > 3true
<小于5 < 3false
>=大于等于5 >= 5true
<=小于等于5 <= 3false

特别注意:判断相等用两个等号 ==,一个等号 = 是赋值。这个错误我见过无数次了,包括我自己也犯过——在 if 条件里写了一个等号,结果程序永远为真……

逻辑运算符

用来组合多个条件:

bool a = true, b = false;
bool r1 = a && b;   // false(与:两个都为真才真)
bool r2 = a || b;   // true(或:一个为真就真)
bool r3 = !a;       // false(非:取反)

实际项目中经常这样用:

int age = 20;
bool hasTicket = true;
if (age >= 18 && hasTicket) {
    cout << "可以入场" << endl;
}

2.6 知识体系总览

下面这张图把本章的核心内容串起来了,你可以对照着复习:

C++基础语法(上) 变量 声明:类型 + 名字 + 初始值 命名规则:字母/下划线开头 数据类型 int / float / double char / bool 常量 const 关键字 #define 宏定义 输入输出 cin >> 输入 cout << 输出 运算符 算术:+ - * / % 关系:== != > < 逻辑:&& || ! 常见陷阱 未初始化变量 整数除法截断 == 写成 = 打好基础,后面才能飞得起来

2.7 避坑指南

最后,我把这些年踩过的坑总结一下,你遇到了可以少走弯路:

  • 变量未初始化:我曾经在嵌入式项目里,一个局部变量没赋初值,结果程序在调试版和发布版表现完全不同,查了两天才发现。
  • 整数除法:写 int result = 5 / 2; 得到的是2,不是2.5。如果你需要小数,记得用浮点数。
  • == 和 = 混淆:这个错误太经典了。我建议你在写 if 条件时,把常量写在左边:if (5 == x),这样如果你少写一个等号,编译器会报错。
  • 浮点数比较:永远不要用 == 比较两个浮点数,用差值绝对值判断。
我的建议:刚开始学的时候,每写一行代码都问自己三个问题——这个变量初始化了吗?这个类型对吗?这个运算符的优先级我清楚吗?养成习惯后,你会少踩很多坑。

好了,这一章的内容就到这里。变量、数据类型、常量、输入输出、运算符——这些是C++最基础的零件。别觉得简单就跳过,我见过太多人基础不牢,后面写复杂程序时各种翻车。你把这些练熟了,后面的路会顺畅很多。


公众号:蓝海资料掘金营,微信deep3321