优先与优先Arity在奇怪的声明中

时间:2015-03-18 13:40:48

标签: c++ expression operator-precedence arity

此声明的执行顺序和可能结果是什么:leap = year%4 == 0;

(左边是赋值和右边的断言?) 以下算法用于计算公历中任何日期的星期几:

static char daytab[2][13] =
{
                {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
                {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
for (year = 1; year <= y; year++)
{
        leap  = year%4 == 0;
        if (year%100 == 0 && year%400 != 0)
                leap = 0;
        for (month = 1; month <= m; month++)
        {
                d += daytab[leap][month - 1];
                daystotal = 365*(year - 1) + (int)floor((year-1)/4)
                - (int)floor((year - 1)/100) + (int)floor((year - 1)/400) + d;
        }
}

2 个答案:

答案 0 :(得分:3)

看这里operator precendence。将评估year % 4,然后将结果与0进行比较,然后将结果分配给leap变量。

答案 1 :(得分:2)

year % 4 == 0相当于(year % 4) == 0,它将年份除以4之后的余数,然后将其与0进行比较并生成布尔结果 - truefalse 。您没有显示leap的声明/定义,因此我们只能猜测它的类型。如果它是bool,则该结果将直接分配给它。基于后面的代码:

if (year%100 == 0 && year%400 != 0)
    leap = 0;

似乎leap可能是其他算术类型(可能是int)。这很常见,特别是在最初用C90编写的代码中,它没有布尔类型。

在这种情况下,bool将在分配之前转换。转换为算术类型后,false转换为0true转换为1(向另一个方向转换,0转换为false },以及任何其他值转换为true)。

因此,代码与以下内容具有基本相同的效果:

if ((year % 4) == 0)
    leap = 1;
else
    leap = 0;

...或:

leap = ((year % 4) == 0) ? 1 : 0;

如果我正在编写它,我想我可能更喜欢编写代码:

if ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0) )
    leap = 1;
else
    leap = 0;

...或(更有可能)只是:

leap = ((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0));

至少在我看来,这更直接地说明了什么是闰年&#34;在阳历中 1 。我想您可以通过以下方式将原始代码视为历史工件:它首先计算它是否是旧Julian日历规则下的闰年,然后单独添加在公历中添加的规则。但是,如果有人真的想反映这段历史,那么它们应该包含一条评论,解释这就是代码按原样编写的原因。就目前而言,它不是仅仅计算正确的值,而是先计算一个可能不正确的值,然后检查更多条件,然后对值进行修补。


1.当然,这类似于:如果它可以被4整除,则一年是闰年,或者不能被100整除,或者也可以被400整除。所以,例如,2000年是闰年(可被整除4也可被400整除但1900不是(可分4,但也可被100整除,不能被400整除)。 功能