# C++基础语法

Canonical: https://www.mirstar.net/2025/11/01/cpp-fundamental/
Author: onlymatt
Published: 2025-11-01T13:05:34.000Z
Updated: 2026-10-21T11:21:55.752Z
Categories: Programming, C++
Tags: Basic Syntax

# 基础语法

## C++中的类型
C++是一种强类型语言，支持多种数据类型。以下是一些常见的C++数据类型：
- 整型（int）
- 浮点型（float, double）
- 字符型（char）
- 布尔型（bool）
- 字符串（string）
- 数组（array）
- 指针（pointer）
- 结构体（struct）
- 类（class）

他们的范围：
- int: -2,147,483,648 到 2,147,483,647（$$-2^{31}$$ 到 $$2^{31}-1$$）
- float: 约 ±3.4E±38 (7 位有效数字)（$$-3.4 \times 10^{38}$$ 到 $$3.4 \times 10^{38}$$）
- double: 约 ±1.7E±308 (15 位有效数字)$$-1.7 \times 10^{308}$$ 到 $$1.7 \times 10^{308}$$）
- char: 单个字符，通常占用1字节

### 类型的转换

洛谷P5704 - 字符大写转换

```cpp
#include<iostream>

using namespace std;

char toupper(char c){
    if(c>='a' && c<='z') 
        return c - ('a' - 'A');
    return c;
}

int main(){
    char c;
    cin >> c;
    // cout << toupper(c);
    cout << (char)(c-32);
    return 0;
}

```

# 题目笔记

洛谷P5721

```cpp
#include<iostream>
using namespace std;

int main(){
    int n,MAX,counter=1;
    scanf("%d",&n);
    MAX = n*(n+1)/2;
    for(int i=0;i<n;i++){
        for(int j=0;j<n-i;j++){
            if(counter<10)
                printf("0%d",counter++);
            else
                printf("%d",counter++);
        }
        printf("\n");
    }
    return 0;
}
```
本题的关键在于抓组两层嵌套循环的规律，外层循环控制行数，内层循环控制每行打印的数字个数。
而且要想到使用counter变量来记录当前要打印的数字，并在每次打印后递增。
有可能会想到使用单层循环，并使用i来记录要打印的数字：
笔者原本想要使用单层循环，但是发现很难控制每行打印的数字个数，所以最终选择了双层循环的方式。
最后通过网络查询到了单层循环的实现方法：

> 使用一个变量来记录这一行要打印的数字的个数，另一个变量记录已经打印的数字的个数，当已经打印的数字个数等于这一行要打印的数字个数时，换行并将要打印的数字个数减一，使已打印的数字的个数归零。

```cpp
#include<iostream>
using namespace std;

int main(){
    int n,MAX,counter=1,print_count=1,current_count=0;
    scanf("%d",&n);
    MAX = n*(n+1)/2;
    for(int i=0;i<MAX;i++){
        if(counter<10)
            printf("0%d",counter++);
        else
            printf("%d",counter++);
        current_count++;
        if(current_count==print_count){
            printf("\n");
            print_count++;
            current_count=0;
        }
    }
    return 0;
}
```
这样的代码更难想到，但是不难发现，两种算法是复杂度是相同的，都是O(n^2)，因为要输出的数字总数是n(n+1)/2.
