条件评估是否优化?这个代码坏了吗
Is condition evaluation optimized ? Is this code bad?
1.想象条件if (obj.is_x() || obj.is_y() || obj.is_z())
如果obj.is_x()
返回true,是否会调用和评估obj.is_y()
和obj.is_z()
?
2.(总的来说)这是个坏主意吗?这个代码看起来不好吗?
bool isbn13_prefix_valid (const string& prefix)
{
unsigned num = stoi(prefix);
if (num == 978 || num == 979) return 1; //super common ones
else if ( num >= 0 && num <= 5 || num == 7 || num >= 600 && num <= 649
|| num >= 80 && num <= 94 || num >= 950 && num <= 989
|| num >= 9900 && num <= 9989 || num >= 99900 && num <= 99999)
return 1;
return 0;
}
-
不,不会,因为短路。
-
是的,那个代码看起来很糟糕。不是因为它不正确,而是因为您将一个超长的条件填充到单个
if
语句中。尝试重构代码以使其更干净。
您的代码非常好。我想看看这些奇怪数字的来源,仅此而已。
把它变成已经提出的十几个琐碎的函数是毫无帮助的。实际上,这会使读取代码变得更加困难,因为它会分散在许多行代码中。是的,它很复杂。但这是因为问题很复杂,试图分散复杂性也于事无补。
您的实际问题:在a||b中,首先评估a。如果它是真的,那么不计算b,并且结果是真的。如果a为假,则b也被评估,结果为真或假,这取决于b的结果。
如果优化编译器能够证明对b的评估没有副作用,并且它认为(主要是由于硬件中的并行性)平均而言,尽可能多地并行评估会更快,即使有些事情是在不必要的时候评估的,那么它可能会在完成对a的评估之前就开始对b进行评估。但这在代码的结果中是不可注意的,只会使代码更快。
相关文章:
- 任何人都可以告诉我我的 C++ 代码出了什么问题?
- 代码占用了我输入的一半
- 我无法找出我的代码出了什么问题
- wxWidgets mac剪贴板在3.1.3上坏了?
- 计时器坏了或者其他什么的
- 为什么我的代码返回了错误的平方值?C++
- 运行简单的.oct文件时Octave崩溃,我的代码出了什么问题?
- 我无法弄清楚我的代码出了什么问题
- boost::p rocess::env 在 ubuntu 19.04 上坏了?
- 堆排序,我无法弄清楚我的代码出了什么问题,输出顺序不正确
- 为什么这段代码崩溃了
- 课堂上的一行,使整个应用程序坏了. 0xC000005错误
- 为什么我的代码给了我错误的结果?
- 我似乎无法理解我的代码出了什么问题,我无法获得输出
- 我的合并sort.h文件中的代码出了什么问题
- 为什么我的代码崩溃了,浮点异常
- PQXX简单代码崩溃了
- 这段代码出了什么问题?它在第二个 cin 可以执行之前终止
- 我的代码怎么了?带有QT的原始输入API
- 条件评估是否优化?这个代码坏了吗