提问人:Jim Babcock 提问时间:11/17/2023 更新时间:11/17/2023 访问量:64
IF 语句中复合 OR 的逻辑问题,给出意外结果
logic issue with compound ORs in an IF statement giving unexpected results
问:
这是用 CF 编写的,但我认为这不是问题所在。虽然,我可能错了,我已经盯着看了这么久,它让我的头都扭曲了。
一般的想法是,如果数据结构未定义,或者 DS 中缺少特定成员或成员是“”,则转发到另一个页面进行修复。我通常不喜欢做否定逻辑,但在这种情况下,积极或直接接近会使 3 行 IF 子句一页长 if/then/else。
<cfset session.returnURL = "/future/dashboard.cfm">
<!---
<cfset session.agentCode = "">
--->
<cfset session.agentCode = "123456789sd">
<cfdump var="#(isStruct(session) neq true)#">
<cfdump var='#(StructKeyExists(session, "agentcode") neq true)#'>
<cfdump var='#(session.agentcode eq "")#'>
<cfdump var=#((isStruct("session") neq true)or(StructKeyExists(session,"agentcode") neq true)
or (session.agentcode eq ""))#>
<cfif ((isStruct("session") neq true) or (StructKeyExists(session, "agentcode") neq true)
or (session.agentcode eq ""))>
<cfoutput>#session.agentCode#</cfoutput>
<cfexit>
<!--- <cflocation url="/future/security/login.cfm" addtoken="No"> --->
</cfif>
.
.
.
前三个转储按预期输出:“No No No”或“No No Yes”,具体取决于为 session.agentCode 公开的 cfset。但是当我将它们与第四个和 IF 语句中的 OR 组合在一起时,无论 3 个输入如何,它都会返回 Yes。通常,这意味着存在嵌套/优先级问题,但我没有看到它。将 3 个 No 输入到 OR 中应返回 No!
谢谢!
答:
2赞
poky
11/17/2023
#1
看起来问题是第 4 个和第 5 个转储中 isStruct 中“session”周围的引号(请注意,它们在第一个转储中不存在);如果你把它们拿走,它应该可以工作。
评论
0赞
poky
11/17/2023
另外,我建议使用!在否定陈述的前面,而不是在末尾的“neq true”;至少对我来说,它更清晰一些,而且绝对更简洁。
0赞
Jim Babcock
11/17/2023
我的天啊,谢谢!@poky我最初有过,但这已经经历了这么多次迭代我有没有提到 ThANK YOU
0赞
poky
11/18/2023
别客气!我也花了一点时间才看到它,直到我将工作的复制并粘贴到非工作的中,然后我才意识到它开始工作。容易错过!
评论
isStruct("session") neq true
session