C/C++ 语言基础
C++ 程序从 main 开始执行。语句通常以分号结束,花括号组成代码块;竞赛中可使用 C++14 及以上标准、标准库和 STL。编写程序时既要保证结果正确,也要关注数据范围、边界和复杂度。
1. 程序结构与输入输出
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
long long sum = 0;
for (int i = 1; i <= n; ++i) {
sum += i;
}
cout << sum << '\n';
return 0;
}
#include 引入头文件,cin 读入、cout 输出。注释可写成 // 单行注释 或 /* 多行注释 */。竞赛中把 ios::sync_with_stdio(false) 和 cin.tie(nullptr) 放在 main 开头可加速流式输入输出;关闭同步后不要混用 cin/cout 与 scanf/printf。
2. 类型、变量与运算
| 类型 | 常见用途 | 注意事项 |
|---|---|---|
int | 普通整数 | 通常为 32 位,运算可能溢出。 |
long long | 较大整数、计数和乘积 | 整数常量也可写为 1LL 参与运算。 |
double | 实数计算 | 存在精度误差,避免直接用 == 比较结果。 |
char、bool | 字符、真假值 | bool 的值为 true 或 false。 |
常用算术运算符为 + - * / %,整数除法会舍去小数部分。比较运算符 < <= > >= == != 产生真假值;逻辑运算符为 !、&&、||,位运算符为 ~ & | ^ << >>。需要显式转换时,优先使用类型清晰的 static_cast:
int count = 2;
double average = 6.4 / static_cast<double>(count);
const double EPS = 1e-9;
constexpr int MAXN = 100000;
优先用 const 或 constexpr 表示常量,而不是为简单常量使用宏。
3. 分支与循环
if (score >= 60) {
cout << "pass\n";
} else if (score >= 0) {
cout << "fail\n";
}
for (int i = 0; i < n; ++i) {
if (a[i] < 0) {
continue;
}
if (a[i] == target) {
break;
}
}
if / else if / else 用于条件分支,已知离散选项时可使用 switch。for 适合计数循环,while 在条件成立时重复,do...while 至少执行一次。break 结束当前循环或 switch,continue 跳过本轮剩余语句。goto 虽可跳转,但会破坏控制流,通常不建议使用。
4. 数组、指针、引用与结构体
数组下标从 0 开始,C++ 不会自动检查越界;访问前应保证下标合法。vector 是更灵活的动态数组。指针保存对象地址,&x 取地址、*p 解引用;空指针使用 nullptr,解引用前必须确认有效。
struct Pack {
int value;
int weight;
};
void addOneByValue(int x) {
++x;
}
void addOneByReference(int &x) {
++x;
}
void addOneByPointer(int *x) {
if (x != nullptr) {
++(*x);
}
}
值传递会复制实参;引用 T& 是对象的别名,可修改实参;读取大型对象时常用 const T& 避免复制。指针可以为空并可改指向其他对象,引用必须在初始化时绑定。struct 可将相关字段组织成一个记录类型。
5. 函数、字符串与 STL
函数用返回值表达计算结果,用参数接收输入。常用容器有 vector、string、queue、stack、map 和 set。字符串可用 size() 获取长度、用下标访问字符;处理前同样要保证下标合法。
vector<int> v = {3, 1, 4, 1, 5};
sort(v.begin(), v.end(), [](int a, int b) {
return a > b;
});
int threshold = 3;
int count = count_if(v.begin(), v.end(), [threshold](int x) {
return x > threshold;
});
sort 默认升序,通常为 O(n log n);reverse 可反转区间。Lambda 是匿名函数,[threshold] 表示按值捕获外部变量,[&] 表示按引用捕获。范围 for 中用 int &x 可修改元素,用 const auto &x 可只读遍历大型元素。
6. 复杂度与安全边界
分析程序时忽略常数和低阶项:单层遍历常为 O(n),两层完整嵌套常为 O(n²),每轮折半常为 O(log n)。选择算法前先看输入规模;同时检查整数是否溢出、数组和指针是否越界,以及循环是否会终止。