2、C++基础语法(上):变量与数据类型
各位同学,咱们今天正式进入C++的语法世界。说实话,每次带新人入门,我都要强调一个观点:基础语法就像盖房子的地基,看着简单,但决定了你后面能盖多高。我自己刚学C++那会儿,总觉得变量声明不就是写个类型加名字嘛,有啥好学的?结果后来在项目里被一个隐式类型转换坑得加班到凌晨两点……嗯,从那以后我再也不敢小看这些基础了。
2.1 变量:程序里的“收纳盒”
变量是什么?说白了就是一块内存空间,我们给它起了个名字,用来存数据。你想想看,程序运行的时候要处理各种信息——用户的年龄、商品的价格、开关的状态……这些都得有个地方放,变量就是干这个的。
声明一个变量的语法很简单:
数据类型 变量名 = 初始值;
举个例子:
int age = 25; // 整型,存年龄
float price = 99.9; // 浮点型,存价格
char grade = 'A'; // 字符型,存等级
bool isLogin = true; // 布尔型,存真假
我个人习惯在声明变量时就给初始值。为什么?因为未初始化的变量里面是垃圾值,我曾经在调试一个支付系统时,发现某个变量没初始化,结果在不同环境下跑出不同的结果,排查了整整一个下午……
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(布尔型)
只有两个值:true 和 false。在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,结果完全不对……
2.4 输入输出:cin 和 cout
程序要和用户交互,就得有输入输出。C++用 cin 和 cout,它们定义在 <iostream> 头文件中。
#include <iostream>
using namespace std;
int main() {
int age;
cout << "请输入你的年龄:";
cin >> age;
cout << "你的年龄是:" << age << endl;
return 0;
}
这里有几个要点:
cout <<是输出,<<叫“插入运算符”cin >>是输入,>>叫“提取运算符”endl是换行,相当于\nusing namespace std;是为了不用每次都写std::cout
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 == 5 | true |
| != | 不等于 | 5 != 3 | true |
| > | 大于 | 5 > 3 | true |
| < | 小于 | 5 < 3 | false |
| >= | 大于等于 | 5 >= 5 | true |
| <= | 小于等于 | 5 <= 3 | false |
特别注意:判断相等用两个等号 ==,一个等号 = 是赋值。这个错误我见过无数次了,包括我自己也犯过——在 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 知识体系总览
下面这张图把本章的核心内容串起来了,你可以对照着复习:
2.7 避坑指南
最后,我把这些年踩过的坑总结一下,你遇到了可以少走弯路:
- 变量未初始化:我曾经在嵌入式项目里,一个局部变量没赋初值,结果程序在调试版和发布版表现完全不同,查了两天才发现。
- 整数除法:写
int result = 5 / 2;得到的是2,不是2.5。如果你需要小数,记得用浮点数。 - == 和 = 混淆:这个错误太经典了。我建议你在写 if 条件时,把常量写在左边:
if (5 == x),这样如果你少写一个等号,编译器会报错。 - 浮点数比较:永远不要用
==比较两个浮点数,用差值绝对值判断。
好了,这一章的内容就到这里。变量、数据类型、常量、输入输出、运算符——这些是C++最基础的零件。别觉得简单就跳过,我见过太多人基础不牢,后面写复杂程序时各种翻车。你把这些练熟了,后面的路会顺畅很多。
公众号:蓝海资料掘金营,微信deep3321