简介:本文面向零基础学习者,系统梳理C++入门阶段的核心语法:从宏常量与const常量的差异、标识符命名规范,到整型、浮点型、字符型、字符串与布尔类型的选择要点,再到cin/cout输入输出以及取模、递增、赋值、比较等运算符的规则细节,并配以可运行示例与常见坑点提示,帮助你把基础打牢、少走弯路。
很多初学者觉得C++难,往往不是难在宏观概念,而是难在细节:单引号写成了双引号、取模用在了小数上、把比较的==敲成了赋值的=。这类小错误轻则编译报错,重则埋下运行期隐患。因此,入门阶段最有效的学习方式,是沿着“常量与变量→命名规则→数据类型→输入输出→运算符”这条主线,把每个知识点的“为什么”和“边界条件”都弄清楚。本文按这条主线展开,所有示例均可直接编写、运行、验证。
宏常量一般写在函数体之外(通常位于文件开头):
#define PI 3.14159
它的本质是预处理阶段的文本替换:编译开始前,代码中所有PI都会被原样替换成3.14159。编译器并不知道PI是什么类型,也不会对它做类型检查。
const写在函数体中或函数体外均可,语法为“const 数据类型 常量名 = 常量值”,即在变量定义前加关键字const,将其修饰为不可修改的常量:
const double PI = 3.14159;
要点有二:
宏是“无类型的文本替换”,const常量“有类型、有作用域、参与类型检查”。因此工程实践中通常优先使用const,宏常量多见于C风格的旧代码。
C++保留了一批关键字(如int、double、const、if、for、return等)供语言自身使用,定义变量时不能与关键字重名。
标识符的四条硬性规则:
在此之上,再补充几条通用的编码建议:
sizeof运算符可实测任意类型或变量占用的内存大小:
cout << "short占用 " << sizeof(short) << " 字节" << endl;cout << "int占用 " << sizeof(int) << " 字节" << endl;
由于long的宽度依赖平台,写跨平台代码时不要凭记忆假设长度,用sizeof确认。日常表示一般整数首选int;范围不够时可用long long(通常8字节)。
float占4字节,有效数字约6~7位;double占8字节,有效数字约15~16位。默认建议用double,精度更稳。
两个容易被忽略的细节:
1)浮点字面量默认是double类型。若要明确得到float,在数字后面加f:
float f1 = 3.14f; // 明确的float字面量double d1 = 3.14; // 默认double
2)科学计数法(e前是尾数,e后是10的幂指数):
float f2 = 3e2; // 3 × 10^2 = 300float f3 = 3e-2; // 3 × 10^-2 = 0.03
另外提醒:浮点数在二进制中往往无法精确表示,判断两个浮点数“相等”时通常不做精确的==比较,而是判断差值是否小于一个极小阈值。
char占1字节,存放单个字符,字面量必须用单引号,且引号内只能有一个字符:
char ch = 'A'; // 正确char ch2 = 'AB'; // 错误:单引号中只能放一个字符
字符的本质是整数(按ASCII编码存储):’A’是65、’a’是97、’0’是48。因此char可以参与整数运算,大小写转换可借助加减32实现。
转义字符用来表示那些无法直接显示或不便输入的ASCII字符,均以反斜杠开头:
cout << "姓名\t年龄\t成绩" << endl;
1)C风格:字符数组加双引号:
char str[] = "hello world";
注意它末尾隐藏着一个’\0’作为结束标志,因此数组实际长度比可见字符数多1。
2)C++风格:string:
#include <string>string s = "hello world";
string支持拼接、比较、求长度等操作,类型安全、用法直观,现代C++应优先使用,前提是包含
bool只占1个字节,取值只有true与false:
bool flag = true;cout << flag << endl; // 输出1
true输出为1,false输出为0;在条件判断中“非0即真”,任何非0数值都会被视为true。
int a = 0;cout << "请输入一个整数:";cin >> a;cout << "你输入的是:" << a << endl;
两个好习惯:输入前先给出提示语;变量声明时就初始化(如int a = 0;),避免使用未定义的值。
int a1 = 10;int b1 = ++a1 * 10; // 前置:先自增再参与运算,a1=11,b1=110int a2 = 10;int b2 = a2++ * 10; // 后置:先参与运算再自增,a2=11,b2=100
两者最终都会让变量+1,区别只在于“本次表达式使用的是自增前还是自增后的值”。建议不要在同一个表达式里对同一变量多次自增,容易引发未定义行为,拆成独立语句最稳妥。
=把右侧的值写入左侧变量;算术运算符可与=组合成复合赋值形式:
int a = 10;a += 2; // 等价于 a = a + 2,此时a为12// 同理:a -= 2; a *= 2; a /= 2; a %= 2;
==、!=、>、<、>=、<=的结果是布尔值:条件成立为1(true),不成立为0(false):
int a = 3, b = 5;int r = (a == b); // a与b不相等,r为0
两点建议:
1)比较表达式适当加括号,如(a == b),让优先级一目了然,可读性更好;
2)警惕把==误写成=:if (a = b)会先执行赋值再用b的真假做判断,语义完全偏离“比较”。一个防御性技巧是把常量写在左边(如3 == a),一旦漏写一个=,编译器会立即报错提醒。
用一张清单回顾全文要点:
最后给一条练习方法:每学一个知识点,立刻写一个最小程序验证;再“故意写错”一次(给const重新赋值、用小数取模、给char赋两个字符),观察编译器如何报错。读懂错误信息的过程,本身就是最快的基础训练。把这些细节内化成肌肉记忆后,再进入流程控制、函数与面向对象等内容,学习曲线会平缓得多。