C++ 奇怪语句中的优先级与算术性
此语句的执行顺序和可能结果是什么:leap=year%4==0 左边是赋值,右边是断言? 它摘自以下算法,用于计算公历中任何日期的星期几:C++ 奇怪语句中的优先级与算术性,c++,expression,operator-precedence,arity,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
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;
}
}
看这里。将对第%4年进行评估,然后将结果与0进行比较,然后将结果分配给leap变量。请查看此处。将对第%4年进行求值,然后将结果与0进行比较,然后将结果分配给leap变量。第%4年==0相当于第%4年==0,它取第4年除以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));
至少对我来说,这更直接地说明了公历中闰年的情况。我想您可以通过以下方式将原始代码视为历史文物:它首先根据旧儒略历的规则计算闰年,然后分别添加在公历中添加的规则。但是,如果有人真的想反映这段历史,他们可能应该包括一条注释,解释这就是代码按原样编写的原因。现在,它不只是计算正确的值,而是从计算可能不正确的值开始,然后检查更多条件,然后修补该值
1.当然,这有点像:一年是闰年,如果它可以被4整除,或者不能被100整除,或者也可以被400整除。例如,2000年是闰年,可以被4整除,也可以被400整除,但1900年不是4整除,也可以被100整除,也不能被400整除。
第%4==0年相当于第%4==0年,它取第4年除以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));
至少对我来说,这更直接地说明了公历中闰年的情况。我想您可以通过以下方式将原始代码视为历史文物:它首先根据旧儒略历的规则计算闰年,然后分别添加在公历中添加的规则。但是,如果有人真的想反映这段历史,他们可能应该包括一条注释,解释这就是代码按原样编写的原因。现在,它不只是计算正确的值,而是从计算可能不正确的值开始,然后检查更多条件,然后修补该值
1.当然,这有点像:一年是闰年,如果它可以被4整除,或者不能被100整除,或者也可以被400整除。例如,2000年是闰年,可以被4整除,也可以被400整除,但1900年不是4整除,也可以被100整除,也不能被400整除。
计算第一年%4,然后将其与0进行比较,比较的分配保存到leap。计算第一年%4,然后将其与0进行比较,比较的分配保存到leap。