如果声明奇怪

时间:2013-11-18 16:26:42

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

我认为这些不会编译,但他们会:

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

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

第一个我无能为力。在第二个语句中,逗号应该是(||)还是运算符? 语法明智是这样总是这样或者它是不久前推出的?

我正在使用Visual Studio 2010。

2 个答案:

答案 0 :(得分:3)

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

等于

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

如果a向右移b次的结果评估为boolcd也分别评估为bool,然后所有这些布尔将彼此 AND - 。

在您的上下文中,将评估逗号中的所有表达式,然后将最后一个表达式传递给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) 

答案 1 :(得分:2)

第一个if语句将被评估为:

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

基本上按a位进行位移b,然后是逻辑和c然后再用d

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

if(10)

总是如此。