通常,如果我使用单个语句跟随Datediff("d", startdate, enddate) -
Datediff("ww", startdate, enddate, crSaturday)-
Datediff("ww", startdate, enddate, crSunday);
语句,我将不需要括号。例如:
if
if (condition) statement1; statement2;
无论如何都会运行。但这不会发生在这里:
statement2
for (j = 0; j < size; j++) {
if (size % 2) if (j % 2) *(minmat + j) *= -1.0;
else {
…
}
}
语句应该与第一个else
语句关联,但它实际上与第二个语句关联。要纠正它,我必须这样做:
if
但是为什么会发生这种情况呢?在第一种情况下,“暗示”第二个for (j = 0; j < size; j++) {
if (size % 2) { if (j % 2) *(minmat + j) *= -1.0; }
else {
…
}
}
语句在括号内?
答案 0 :(得分:3)
这种歧义被称为dangling else问题。无论您看到什么直观,语言设计者都会决定else
与最接近的匹配if
相关联。如果我考虑一下,我发现这个决定很自然,但这是值得商榷的。没有争议的是必须作出决定并且不再能够改变它。
答案 1 :(得分:3)
else语句将与最新的if相关联。你也可以这样纠正:
for(j=0; j<size; j++{
if(size%2) if(j%2) *(minmat+j) *= -1.0; else;
else {
.
.
.
}
}
答案 2 :(得分:1)
来自C99标准:
6.8.4.1 if语句
...
3
else
与语法允许的词法最接近的前if
相关联。
因此,
if(size%2) if(j%2) *(minmat+j) *= -1.0;
else {
.
.
.
}
相当于:
if(size%2)
{
if(j%2) *(minmat+j) *= -1.0;
else {
.
.
.
}
}
相当于:
if(size%2)
{
if(j%2) {
*(minmat+j) *= -1.0;
}
else {
.
.
.
}
}
答案 3 :(得分:1)
不确定为什么你认为“暗示”括号存在,或者在这里适用。正确缩进,你写了:
var timer2: Timer = new Timer(2000);
timer2.addEventListener(TimerEvent.TIMER, finishMove);
function checkScoreScene10(): void {
if (scoreScene10 >= 300) {
timer2.start();
}
}
function finishMove(e: TimerEvent): void {
if (stage.contains(gdropBall2)) {
removeChild(gdropBall2);
} else if (stage.contains(Wall2Missing)) {
removeChild(Wall2Missing);
} else if (stage.contains(gdropBall1)) {
removeChild(gdropBall1);
gotoAndStop(2);
}
function stopTimer(event: TimerEvent): void {
timer2.removeEventListener(TimerEvent.TIMER, stopTimer);
timer2 = null;
}
}
for(j=0; j<size; j++{
if(size%2)
if(j%2)
*(minmat+j) *= -1.0;
else {
}
}
将附加到词汇最近的else
。
答案 4 :(得分:0)
else
是一个比if
更容易受if
到另一个if
的运营商。因此它&#34;坚持&#34;到最近的if。它就像乘法在加法之前一样。
这是一条有意义的规则,因为否则没有括号的嵌套ifs会出现问题。