此声明的执行顺序和可能结果是什么: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;
}
}
答案 0 :(得分:3)
看这里operator precendence。将评估year % 4
,然后将结果与0进行比较,然后将结果分配给leap
变量。
答案 1 :(得分:2)
year % 4 == 0
相当于(year % 4) == 0
,它将年份除以4之后的余数,然后将其与0进行比较并生成布尔结果 - true
或false
。您没有显示leap
的声明/定义,因此我们只能猜测它的类型。如果它是bool
,则该结果将直接分配给它。基于后面的代码:
if (year%100 == 0 && year%400 != 0)
leap = 0;
似乎leap
可能是其他算术类型(可能是int
)。这很常见,特别是在最初用C90编写的代码中,它没有布尔类型。
在这种情况下,bool
将在分配之前转换。转换为算术类型后,false
转换为0
,true
转换为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整除)。 功能