有人能告诉我这段代码如何在两个 if 之间没有花括号的情况下工作吗?

Can somebody tell me how this code working with no curly braces between two if?

如果我将代码放在花括号中的第一个 if upto second return 之后,它不会给我所需的输出。

static int comparator(Player a, Player b)  {
     if(a.score == b.score)
         if(a.name == b.name)
         return 0;
         else
         return (a.name > b.name)? -1:1;
         return (a.score < b.score)? -1:1;
     
 }

没有大括号,if 守卫仅适用于 立即 下一条语句。
这就是语言的工作原理。 :/

您的代码包含 if()else 语句。每个人都将执行他们之后的一行代码。这意味着它只会执行一条语句并在它找到的第一个 ; 之后结束。

for() 循环、while() 循环、if-else 块可以在没有大括号的情况下使用,如果您要执行的语句仅包含跟随它们的一行代码。

你的代码是 -

static int comparator(Player a, Player b)  {
     // if statement without braces- means just one statement executes
     if(a.score == b.score)
         // Remember if-else will be considered as a single code block so both will run
         if(a.name == b.name)
             return 0;
         else
             return (a.name > b.name)? -1:1;
 
     // This statement will run only when the above if condition is not satisfied
     return (a.score < b.score)? -1:1;          
 }

这可以认为与-

相同
static int comparator(Player a, Player b) {
    if(a.score == b.score) {
        if(a.name == b.name) {
            return 0;
        } else {
            return (a.name > b.name) ? -1 : 1;
        }
    }
    return (a.score < b.score) ? -1 : 1;
}

注意: 如果您使用大括号通常会更好,因为它有利于代码的可读性和可维护性。实际上可以有两种解析它的方式 - Dangling else(尽管大多数编译器会将 else 与最接近的 if 相关联)。

在这种编码风格中,无法区分以下两个代码 -

if(condition1)
    if(condition2)
        foo1();
    else
        foo2();

并且,

if(condition1)
    if(condition2)
        foo1();
else
    foo2();

因为在C/C++中,它没有考虑代码中的缩进,因此在阅读代码时可能会产生歧义。所以最好使用花括号而不是像上面那样做。仅当您只有一行时才删除它们,稍后阅读代码时不会造成任何混淆...

希望对您有所帮助!

没有花括号,只执行下一条语句。通过适当的缩进,可以更容易地看到发生了什么:

static int comparator(Player a, Player b) {
    if(a.score == b.score)
        if(a.name == b.name)
            return 0;
        else
            return (a.name > b.name) ? -1 : 1;
    return (a.score < b.score) ? -1 : 1;
}

这其实是一样的:

static int comparator(Player a, Player b) {
    if(a.score == b.score) {
        if(a.name == b.name) {
            return 0;
        } else {
            return (a.name > b.name) ? -1 : 1;
        }
    }
    return (a.score < b.score) ? -1 : 1;
}

您可能使用了无括号 else 变体,但在编写类似以下内容时没有注意到它:

if(condition) {
    // 
} else if(another_condition) {
    //
} else {
    //
}

其实和

是一样的
if(condition) {
    //
} else {
    if(another_condition) {
        //
    } else {
        //
    }
}