C++中如何设置int类型变量的合法取值范围?
C++ 变量范围判断的高效复用实现
运行效率说明
你当前手写的if(a <=1 || a >= 1000)已经是CPU执行效率最高的写法,仅包含2次整数比较和1次逻辑或运算,没有任何额外开销,现代编译器会将其优化为最短的CPU指令序列。
网传的无符号数转换写法(unsigned)(a - 2) < 998和上述判断逻辑完全等价,运行效率没有差异,但可读性极差,普通项目不推荐使用,反而会提升维护成本。
多变量复用方案
核心需求是避免重复编写判断逻辑,直接封装通用模板函数即可,编译期展开后和手写判断的效率完全一致,没有任何运行时损耗:
1. 通用范围判断函数
支持任意数值类型的开区间判断,适配所有整数、浮点数的范围校验:
// 校验逻辑:min < val < max template<typename T> bool is_in_open_range(T val, T min, T max) { return val > min && val < max; }
使用示例:
#include <iostream> int main() { int a; std::cin >> a; if (!is_in_open_range(a, 1, 1000)) { // 这里写输入不合法的处理逻辑,比如提示重新输入、报错退出 } return 0; }
如果后续需要调整区间类型(比如改为闭区间、左闭右开),只需要修改函数内的比较运算符即可,所有调用的地方统一生效,不用逐个修改。
2. 输入+判断一体化封装
如果需要同时处理输入失败的场景(比如用户输入了非数字内容),可以进一步封装为输入函数:
template<typename T> bool read_in_open_range(T& val, T min, T max, std::istream& in = std::cin) { // 先判断输入是否为合法的对应类型 if (!(in >> val)) { return false; } return val > min && val < max; }
使用示例:
int a, b, c; // 一次性校验多个变量的输入合法性 if (!read_in_open_range(a, 1, 1000) || !read_in_open_range(b, 10, 20) || !read_in_open_range(c, 0, 50)) { // 任意变量输入不合法的处理逻辑 }
内容的提问来源于stack exchange,提问作者LostITguy
相关产品推荐
相关产品推荐

