社区讨论
警示后人,一个习以为常的 UB
学术版参与者 7已保存回复 42
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 42 条
- 当前快照
- 1 份
- 快照标识符
- @mir7kn86
- 此快照首次捕获于
- 2025/12/04 17:03 3 个月前
- 此快照最后确认于
- 2025/12/04 20:28 3 个月前
本文前置缺省源
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
#ifdef __linux__
#define pc putchar_unlocked
#define gc getchar_unlocked
#else
#define pc putchar
#define gc getchar
#endif
#define all(x) x.begin(),x.end()
#define TTT template<typename T>
快读快写这么写是错的:
CPPnamespace FastIO{
TTT inline void r(T&x){
x=0;char ch=gc();bool ok=0;
for(;ch>'9'||ch<'0';ch=gc())ok^=(ch=='-');
for(;ch>='0'&&ch<='9';ch=gc())
x=(x<<1)+(x<<3)+ch-48;
if(ok)x=-x;
}
}
应为读入极大值时,可能 但我保龄了。
(x<<1)+(x<<3) 和 (x<<1)+(x<<3)+ch-48 都在 T 的范围内,但是 (x<<1)+(x<<3)+ch > (x<<1)+(x<<3)+ch-48,算到这部的时候可能会上溢 T 导致 UB,但这个错误在大多环境下的结果都偏稳定,可能写错了也关系不大,同理,
(x<<1)+(x<<3)-48+ch 也可能导致 UB,可能下溢 T,正确的写法是:(x<<1)+(x<<3)+(48^ch)高效,安全。
回复
共 42 条回复,欢迎继续交流。
正在加载回复...