else if 和大括号

else if & curly brackets

为什么这两个代码片段有不同的输出?

它们之间的唯一区别是每个 if/else-if 语句周围的大括号,但这在这里无关紧要,对吧?

while (1){
    if (i>=n&&j<0)
        break;

    else if (j<0)
        if (Arr[i])
            c++;

    else if (i>=n)
        if(Arr[j])
            c++;

    else if (Arr[i]==1&&Arr[j]==1)
        c+=2;

    i++;
    j--;
}

..

while (1){
    if (i>=n&&j<0){
        break;
    }
    else if (j<0){
        if (Arr[i])
            c++;
    }
    else if (i>=n){
        if(Arr[j])
            c++;
    }
    else if (Arr[i]==1&&Arr[j]==1){
        c+=2;
    }
    i++;
    j--;
} 

如果第一个代码片段的格式正确

while (1){
    if (i>=n&&j<0)
        break;

    else if (j<0)
        if (Arr[i])
            c++;

        else if (i>=n)
            if(Arr[j])
                c++;
            else if (Arr[i]==1&&Arr[j]==1)
                c+=2;

    i++;
    j--;
}

那么可以看出else or else if对应的是最接近的if语句

解析器将 else-branch 与最接近的 if 链接起来,因此它将解析像

这样的表达式
if(a) if(b) c; else d;

作为

if(a) {if(b) c; else d;}

而不是

if(a) {if(b) c;} else d;