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

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

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

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

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

我正在使用 Visual Studio 2010。

【问题讨论】:

  • 第一个有位移位和逻辑与,逗号运算符不等于逻辑或,否则不存在。研究逗号运算符并不难。
  • 仅仅因为它编译,并不意味着它正在做你认为它正在做的事情。如果您不确定,请在使用之前研究您正在使用的运算符 - 这方面已经有很多问题了。
  • 你说得对,我应该搜索逗号运算符。

标签: c++ visual-studio-2010 if-statement


【解决方案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 个。我改变了我的答案。谢谢。
    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多