奇怪的 if 语句

Posted

技术标签:

【中文标题】奇怪的 if 语句【英文标题】:Odd if statements 【发布时间】:2013-11-18 16:26:41 【问题描述】:

我不认为这些 if 会编译,但它们可以:

if (a>>b&&c&&d)

if (month==1,2,3,5,7,9,10) 

第一个我一无所知。在第二个语句中,逗号应该是 (||) 还是运算符? 语法明智的是它总是这样还是它是前一段时间引入的?

我正在使用 Visual Studio 2010。

【问题讨论】:

第一个有位移位和逻辑与,逗号运算符不等于逻辑或,否则不存在。研究逗号运算符并不难。 第二个见return list of values between parenthesis (10, 20, 30, 40)? 仅仅因为它编译,并不意味着它正在做你认为它正在做的事情。如果您不确定,请在使用之前研究您正在使用的运算符 - 这方面已经有很多问题了。 Comma Operator in Conditon of Loop in C的可能重复 你说得对,我应该搜索逗号运算符。 【参考方案1】:
if (a>>b && c && d)

等于

if ((a>>b) && c && d)

如果a 右移b 次的结果计算为boolcd 也分别计算为bool,那么所有这些布尔值将是AND em>-ed 到对方。

 

在您的上下文中,将计算逗号内的所有表达式,然后将最后一个表达式传递给 if 表达式:

if (month==1,2,3,5,7,9,10) -> is equal to
if (2,3,5,7,9,10)          -> is equal to
if (3,5,7,9,10)            -> is equal to
if (5,7,9,10)              -> is equal to
if (7,9,10)                -> is equal to
if (9,10)                  -> is equal to
if (10)

总是true

 

不应该是||&&。如果你想要 ORAND 如下所示:

if (month==1 || month==2 || month==3 || ....)

if (month==1 && month==2 && month==3 && ....)
// Also month can not simultaneously be equal to more than one value!
// then, it's equal to
if (false) 

【讨论】:

【参考方案2】:

第一个 if 语句的计算方式如下:

if(((a >> b) && c) && d)

基本上将a位移b位,然后逻辑位移c,然后位移d

第二个是comma operator,它将评估第一个术语并将其丢弃,然后是第二个,依此类推并返回最后一个术语的结果。所以在我们的例子中,这个语句相当于:

if(10)

这总是正确的。

【讨论】:

所以那时只有 10 个。我改变了我的答案。谢谢。

以上是关于奇怪的 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

if语句中的奇怪行为

Laravel 4:刀片布局中的 if 语句很奇怪

具有零值双精度的奇怪 if 语句行为

Vue.js if语句的问题。工作真的很奇怪

shell脚本的条件测试的奇怪内容

return 语句中的奇怪表达式