return 限制数字(例如 INT_MAX)表示 false 总是安全的吗?
Is it always safe to return limit numbers (e.g. INT_MAX) to signify false?
说,我有以下(成员)函数,如果矩形被击中,returns 最接近矩形的左侧或右侧:
int hit(int x)
{
if (rc.left <= x && x < rc.right)
{
if (x <= (rc.left + size.width / 2)) return rc.left;
else return rc.right;
}
else return INT_MAX;
}
我担心的是 INT_MAX
在我的机器上只是一个数字的宏,无法在代码 运行 所在的机器上表示。 INT_MAX
不是 运行 时间的东西,所以我有些怀疑。
您使用的这个模式是一个标记值,一个从您的数据类型的可能取值范围中取出并赋予特定含义的值。这可能是一种有效的方法,但确实需要所有代码都知道该值及其含义。如果您不希望获得潜在的小性能提升,则可以使用更具表现力的类型:
std::optional<int> hit(int x)
{
if (rc.left <= x && x < rc.right)
{
if (x <= (rc.left + size.width / 2)) return rc.left;
else return rc.right;
}
else return {};
}
这样你就可以return没有特殊外壳的香草int
,或者什么都没有。
在这里,我说的是我做这个时的典型值 post。到今天为止,大多数系统都将 int 作为 32 位。
对于32位有符号整数,INT_MAX代表2147483647这个数,INT_MAX的存在是为了方便用户使用,不用remember/search for/calculate 这个号码他们想用就用。
INT_MAX 是 C++ 的东西,不仅仅是在你的机器上,任何机器上的合适的 C++ 编译器,包括它 运行 的机器,应该能够正确编译它。如果你确定rc.left和rc.right的值不会和INT_MAX一样,只要你在检查函数输出的地方也使用它,应该没问题。
我还想知道它会 运行 在哪台机器上,以及它会如何 运行 在那台机器上。如果你的意思是 运行 只是简单地执行你编译的二进制文件,应该没有问题。但是,如果您也在那里编译它,我假设您正在提交作业或某种评分员之类的东西?然后你可以尝试阅读他们的编译器的规范,看看他们使用什么,如果你真的想知道你想编译代码的地方有什么限制。
要点是因为它是 C++ 的东西,所以它可以是 represented on the machine
而不管实际限制是什么。
My concern is that INT_MAX, which is just a macro of a number on my machine, can't be represented on machine on which the code will run.
INT_MAX不是固定值。是的,它是一个宏,但不同的机器会有不同的定义。它是每台机器,每个编译器,就像几乎所有其他东西一样。编译器将确保 INT_MAX 适合 int。是的,当为架构 B 编译时,您不能只是 运行 架构 A 上的二进制文件。即使从技术上讲它对某些架构是可行的(因为一个扩展了另一个,例如 x86 与 x64),重新编译总是更安全。但是如果两个架构相同应该没有问题。
else return INT_MAX;
您的代码的真正问题在于 INT_MAX 可能是一个有效值。即使它不是,那么它看起来像一个值,这可能是一种容易出错的方法(你强制调用者进行数值检查,如果他忘记了怎么办?)。意义值和错误是不同的东西,因此最好也以不同的方式表示它们。
您应该使用其他方式来指示错误,例如std::optional 或异常。或者可以将功能分为两个功能:检查和计算。无论哪种方式,您都会摆脱 INT_MAX 作为奖励。
说,我有以下(成员)函数,如果矩形被击中,returns 最接近矩形的左侧或右侧:
int hit(int x)
{
if (rc.left <= x && x < rc.right)
{
if (x <= (rc.left + size.width / 2)) return rc.left;
else return rc.right;
}
else return INT_MAX;
}
我担心的是 INT_MAX
在我的机器上只是一个数字的宏,无法在代码 运行 所在的机器上表示。 INT_MAX
不是 运行 时间的东西,所以我有些怀疑。
您使用的这个模式是一个标记值,一个从您的数据类型的可能取值范围中取出并赋予特定含义的值。这可能是一种有效的方法,但确实需要所有代码都知道该值及其含义。如果您不希望获得潜在的小性能提升,则可以使用更具表现力的类型:
std::optional<int> hit(int x)
{
if (rc.left <= x && x < rc.right)
{
if (x <= (rc.left + size.width / 2)) return rc.left;
else return rc.right;
}
else return {};
}
这样你就可以return没有特殊外壳的香草int
,或者什么都没有。
在这里,我说的是我做这个时的典型值 post。到今天为止,大多数系统都将 int 作为 32 位。
对于32位有符号整数,INT_MAX代表2147483647这个数,INT_MAX的存在是为了方便用户使用,不用remember/search for/calculate 这个号码他们想用就用。
INT_MAX 是 C++ 的东西,不仅仅是在你的机器上,任何机器上的合适的 C++ 编译器,包括它 运行 的机器,应该能够正确编译它。如果你确定rc.left和rc.right的值不会和INT_MAX一样,只要你在检查函数输出的地方也使用它,应该没问题。
我还想知道它会 运行 在哪台机器上,以及它会如何 运行 在那台机器上。如果你的意思是 运行 只是简单地执行你编译的二进制文件,应该没有问题。但是,如果您也在那里编译它,我假设您正在提交作业或某种评分员之类的东西?然后你可以尝试阅读他们的编译器的规范,看看他们使用什么,如果你真的想知道你想编译代码的地方有什么限制。
要点是因为它是 C++ 的东西,所以它可以是 represented on the machine
而不管实际限制是什么。
My concern is that INT_MAX, which is just a macro of a number on my machine, can't be represented on machine on which the code will run.
INT_MAX不是固定值。是的,它是一个宏,但不同的机器会有不同的定义。它是每台机器,每个编译器,就像几乎所有其他东西一样。编译器将确保 INT_MAX 适合 int。是的,当为架构 B 编译时,您不能只是 运行 架构 A 上的二进制文件。即使从技术上讲它对某些架构是可行的(因为一个扩展了另一个,例如 x86 与 x64),重新编译总是更安全。但是如果两个架构相同应该没有问题。
else return INT_MAX;
您的代码的真正问题在于 INT_MAX 可能是一个有效值。即使它不是,那么它看起来像一个值,这可能是一种容易出错的方法(你强制调用者进行数值检查,如果他忘记了怎么办?)。意义值和错误是不同的东西,因此最好也以不同的方式表示它们。
您应该使用其他方式来指示错误,例如std::optional 或异常。或者可以将功能分为两个功能:检查和计算。无论哪种方式,您都会摆脱 INT_MAX 作为奖励。