阶段性总结与提高

输入输出

cin、cout

int a;
float b;
char c;
char d[100];
string e;
cin >> a >> b >> c >> d >> e;
cout << a << b << c << d << e;

带空格字符数组、字符串输入

char c[100];
cin.ignore(); // 清除之前的换行符
cin.getline(c, 100);

string s;
cin.ignore(); // 清除之前的换行符
getline(cin, s);

scanf()、printf()

int a;
float b;
long long c;
double d;
char e;
char f[100];
    
scanf("%d %f %lld %lf %c %s", &a, &b, &c, &d, &e, f);
printf("%d %f %lld %lf %c %s", a, b, c, d, e, f);

printf和scanf不支持string类型的操作,但可以转换输出

string s="hello world";
printf("%s",s.c_str());

getchar()、putchar()

char ch;
ch = getchar();  // 从键盘读取一个字符
putchar(ch);     // 输出一个字符

getline、cin.getline、getchar均需要注意缓冲区换行符问题

格式化对比

功能printfcout
换行"\n"endl 或 "\n"
整数%d直接输出
小数%f直接输出
保留2位小数%.2fcout << fixed << setprecision(2)
宽度5位%5dcout << setw(5)
左对齐%-5dcout << left << setw(5)
右对齐%5dcout << right << setw(5)
填充0%05dcout << setfill('0') << setw(5)

时间超时处理

当输入或输出的次数达到10万以上时,超时(TLE)概率极高,因此需要特殊处理,以下两个方案均可:

  1. 使用scanf和printf代替cin和cout(推荐)
  2. cin/cout加速(必会)
#include <iostream>
using namespace std;

int main() {
    // 加速代码(固定写法)
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    return 0;
}

使用cin/cout加速后,endl用”\n”代替,且不能与scanf与printf混用。

此外,最优方案为自定义快读快写(暂时不需要掌握,达到100w以上才需要)

运算符

算术运算符

运算符含义示例
+加法a + b
-减法a - b
*乘法a * b
/除法(整数相赢得整数)10 / 3 = 3
%取模(余数)10 % 3 = 1
++自增i++ (后置), ++i (前置)
--自减i----i

赋值运算符

运算符示例等价于
=a = 5
+=a += 3a = a + 3
-=a -= 3a = a - 3
*=a *= 3a = a * 3
/=a /= 3a = a / 3
%=a %= 3a = a % 3

关系运算符(比较运算符)

运算符含义示例
==等于a == b
!=不等于a != b
>大于a > b
<小于a < b
>=大于等于a >= b
<=小于等于a <= b

逻辑运算符

运算符含义说明
&&逻辑与两者都为真才真
||逻辑或一个为真即为真
!逻辑非取反

位运算符

运算符含义示例
&按位与5 & 3 = 1 (101 & 011 = 001)
|按位或5 | 3 = 7 (101 | 011 = 111)
^按位异或5 ^ 3 = 6 (101 ^ 011 = 110)
~按位取反~5 = -6
<<左移5 << 1 = 10 (1010)
>>右移5 >> 1 = 2 (10)

条件运算符(三目、三元)

// 语法: 条件 ? 真值 : 假值
int a = 10, b = 20;
int max = (a > b) ? a : b;  // max = 20

其他运算符

sizeof运算符

int a = 10;
cout << sizeof(int) << endl;   // 4 字节
cout << sizeof(a) << endl;     // 4
cout << sizeof(double) << endl; // 8

逗号运算符

int a, b, c;
a = (b=3, c=5, b+c);  // 从左到右执行,返回最后一个值
cout << a << endl;  // 8

优先级

优先级运算符结合性
1() [] -> . ::左到右
2! ~ ++ -- + - * & (单目)右到左
3* / %左到右
4+ -左到右
5<< >>左到右
6< <= > >=左到右
7== !=左到右
8&左到右
9^左到右
10|左到右
11&&左到右
12||左到右
13?:右到左
14= += -= 等右到左
15,左到右