有人能告诉我这段代码如何在两个 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 {
//
}
}
如果我将代码放在花括号中的第一个 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 {
//
}
}