问题描述
SELECT disTINCT w.W_ID,'Proc' ProcHeaderName,p.ProcNumber ProcValue,'Class' ClassHeaderName,p.Class ClassValue
INTO #Procs
FROM proc p
LEFT JOIN (SELECT wt.W_ID,wt.TestId
from TestValue wt where wt.IsDeleted = 0) as wtRow on wtRow.W_ID in (SELECT ID FROM #tmp)
LEFT JOIN TableNameHere c on c.IsDeleted = 0 and c.col_ID in (SELECT col_ID FROM tmp)
WHERE p.IsDeleted = 0 and [dbo].[GetTestIdJson](c.Json,wtRow.TestId) = wtRow.TestId
AND p.ProcNumber + ',' + p.RNumber = JSON_VALUE(c.Json,'$.Property.Label') + ',' + JSON_VALUE(c.Json,'$.Property.Label')
GROUP BY wtRow.W_ID,p.ProcNumber,p.Class
我担心先评估哪个表达式,std::map<int,int> mp;
// do something
auto itor = mp.find(some_value);
if (itor != mp.end() && itor->second == some_other_value) {
// do something
}
还是 itor != mp.end()
?
如果首先评估第二个(可能是因为一些编译器优化?),它可能会得到未定义的行为,因为 itor->second == some_other_value
可能为真。
我是否应该担心这个问题,以便我必须这样编码:
itor == mp.end()
解决方法
不用担心;你的代码没问题。
如果 if (a && b)
的第一个条件为假,则不评估第二个条件。
查找“短路评估”
Wikipedia 有一些信息。
,逻辑与 - && - 表达式被从左到右计算,所以 itor != mp.end()
将被初始计算。此外,只有当两个表达式都返回真时才返回真,因此如果第一个为假,则不检查第二个。
所以第一种情况应该有效。