条件分支评估
Conditional branching evaluation
const int IX(int x, int y, std::size_t width)
{
if ((width * y + x) > 0)
{
return width * y + x;
}
else
{
return 0;
}
}
const int IX(int x, int y, std::size_t width)
{
int value = width * y + x;
if (value > 0)
{
return value;
}
else
{
return 0;
}
}
在这里,如果x=0
和y=-1
独立于width
,第一个函数返回第一个分支(为什么?(,第二个函数返回预期的内容。这是一个编译器错误,还是我错过了什么? 我使用的是Visual Studio 2019编译器。
这是推动摆脱无符号类型的主要展示,除了非常狭窄的域(即位操作(。
在你的第一个函数中,你直接在分支中检查值,
(width * y)
假设width
是无符号的(size_t
(,其结果也是无符号的(在您的情况下,相当大的值(,因此,将始终大于或等于零。
在第二个函数中,你获取一个无符号值,然后将其放回有符号:
int i = width * y
结果,它再次变为签名,现在变为小于 0。
尝试打开编译器警告,您将看到很多警告。
相关文章:
- std::condition_variable::wait()如何评估给定的谓词
- IPC使用多个管道和分支进程来运行Python程序
- 如何删除peer if else分支中的冗长句子
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- c++11评估顺序(未定义的行为)
- 如何正确地将分支添加到已存在的树中
- 如何将分支添加到已存在的TTree:ROOT
- 如何删除 LLVM 中的不规则分支?
- 如何使用"equal to"以外的评估编写开关语句
- 嵌套 if 中没有返回评估
- 懒惰的参数评估try_emplace?
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 如果以下行不包含决策或分支,GDB 无法单步跳过函数
- C++17:使用 std::optional 来评估枚举是否包含值
- CNTK:->转发或 ->评估某些电脑上的崩溃,而不是其他电脑上的崩溃
- ConstexPR :GCC比Clang更努力地评估ConstexPR
- 函数指针与条件分支
- C++:Constexpr斐波那契数列评估
- 条件分支评估