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/coutscanf/printf

2. 类型、变量与运算

类型常见用途注意事项
int普通整数通常为 32 位,运算可能溢出。
long long较大整数、计数和乘积整数常量也可写为 1LL 参与运算。
double实数计算存在精度误差,避免直接用 == 比较结果。
charbool字符、真假值bool 的值为 truefalse

常用算术运算符为 + - * / %,整数除法会舍去小数部分。比较运算符 < <= > >= == != 产生真假值;逻辑运算符为 !&&||,位运算符为 ~ & | ^ << >>。需要显式转换时,优先使用类型清晰的 static_cast

int count = 2;
double average = 6.4 / static_cast<double>(count);

const double EPS = 1e-9;
constexpr int MAXN = 100000;

优先用 constconstexpr 表示常量,而不是为简单常量使用宏。

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 用于条件分支,已知离散选项时可使用 switchfor 适合计数循环,while 在条件成立时重复,do...while 至少执行一次。break 结束当前循环或 switchcontinue 跳过本轮剩余语句。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

函数用返回值表达计算结果,用参数接收输入。常用容器有 vectorstringqueuestackmapset。字符串可用 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)。选择算法前先看输入规模;同时检查整数是否溢出、数组和指针是否越界,以及循环是否会终止。