可以在一种情况下使用 map::find 和 iterator::second

问题描述

我有这样一段代码

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() 将被初始计算。此外,只有当两个表达式都返回真时才返回真,因此如果第一个为假,则不检查第二个。

所以第一种情况应该有效。