社区讨论

警示后人,一个习以为常的 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>
快读快写这么写是错的:
CPP
namespace 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 条回复,欢迎继续交流。

正在加载回复...