delphi - 关于 Delphi 上的比较运算符
问题描述
在 Javascript 中,如果我执行以下命令:
if (cond1 && cond2) {
}
如果 cond1 为假,解析器将停止,无需检查 cond2。这对性能有好处。
以相同的方式 :
if (cond1 || cond2) {
}
如果 cond1 为真,则无需检查 cond2。
较新的 Delphi 版本有类似的东西吗?我在10.4
谢谢
解决方案
是的,Delphi 编译器支持布尔短路评估。它可以使用编译器指令来启用或禁用,但默认情况下是启用的,并且 Delphi 代码通常假定它是启用的。
这通常不仅用于提高性能,还用于更简洁地编写代码。
例如,我经常写这样的东西
if Assigned(X) and X.Enabled then
X.DoSomething;
或者
if (delta > 0) and ((b - a)/delta > 1000) then
raise Exception.Create('Too many steps.');
或者
if TryStrToInt(s, i) and InRange(i, Low(arr), High(arr)) and (arr[i] = 123) then
DoSomething
或者
i := 1;
while (i <= s.Length) and IsWhitespace(s[i]) do
begin
// ...
Inc(i);
end;
或者
ValidInput := TryStrToInt(s, i) and (i > 18) and (100 / i > 2)
在所有这些例子中,我依靠评估来“过早地”停止。否则,我会遇到访问冲突、除以零错误、随机行为等。
事实上,我每天都在编写假设布尔短路评估已开启的代码!
这是惯用的德尔福。
推荐阅读
- html - 打印时缩放 HTML 以适合一页
- amazon-web-services - 使用 boto3 Python 在 aws 中创建实例
- angular - 无法以角度分配数据源值
- unit-testing - DAOTestRule 是否已从 Dropwizard 中弃用?什么是替代方案?
- python - 使用sklearn进行高斯朴素贝叶斯分类的数据类型,如何清理数据
- php - 删除聊天的逻辑语句和条件
- c++ - 设计函数模板以处理字符串/字符参数的最佳实践是什么?
- python-3.x - python新手,尝试在托管服务器上写入和读取pickle文件
- java - java中的正则表达式匹配数字,少数特殊字符和字母
- php - 在 null 上调用成员函数 get() 时出错