为什么这个if语句需要括号?

时间:2015-05-18 20:10:57

标签: c if-statement

通常,如果我使用单个语句跟随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 { … } } 语句在括号内?

5 个答案:

答案 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会出现问题。