Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪语句中的优先级与算术性_C++_Expression_Operator Precedence_Arity - Fatal编程技术网

C++ 奇怪语句中的优先级与算术性

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

此语句的执行顺序和可能结果是什么: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;
        }
}
看这里。将对第%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。