我们通常会遇到不开 -O2 能过或者本地能过, 开了/提交 就 WA {\color{#E74C3C} WA} /RE {\color{#9D3DCF} RE} /TLE {\color{#052242} TLE} 了,到底是因为什么呢?此时,程序就有可能存在ub


所以说什么是ub?

ub(未定义行为Undefined Behavior)是一类对程序无任何限制的行为,在 C++ 中,ub行为的例子众多,下文将会提到一些例子

如果你的程序 RE {\color{#9D3DCF} RE} Segmentation {\color{#9D3DCF} Segmentation} fault {\color{#9D3DCF} fault} ,建议检测是否ub,与其他评测结果不同,RE {\color{#9D3DCF} RE} Segmentation {\color{#9D3DCF} Segmentation} fault {\color{#9D3DCF} fault} 的一般原因是ub


1. 带符号整数形运算溢出short/int/long/long long

例:

#include <bits/stdc++.h>
using namespace std;
signed main() {
    int num = 2147483647;
    cout << num + 1;
}

输出结果是 -2147483648

因为 int 的范围是 -2147483648 ~ 2147483647

然而运算结果是 2147483648

注意! unsigned 整数型是自然溢出不是ub行为

2. 越界访问

越界访问通常因为数组 开大/开小 ,会由于非法访问内存RE {\color{#9D3DCF} RE}

3. 访问未初始化的变量

#include <iostream>
using namespace std;
signed main() {
   int num;
   if(num) cout<<"True"<<endl;
   if(!num) cout<<"False"<<endl;
}
#include <iostream>
using namespace std;
int num;
signed main() {
   if(num) cout<<"True"<<endl;
   if(!num) cout<<"False"<<endl;
}

第1个程序存在ub,num 是在主函数 main 中的局部变量,不会初始化需要自行赋值;第2个程序中 num 是全局变量会被初始化值为 0 无需自行赋值,不存在ub

4. 无法确定运算顺序

例:

num++ + ++num

(敬请期待)

0 comments

No comments so far...