奇怪的 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
次的结果计算为bool
、c
和d
也分别计算为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
。
不应该是||
或&&
。如果你想要 OR 或 AND 如下所示:
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 语句的主要内容,如果未能解决你的问题,请参考以下文章