简体   繁体   中英

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

If I am enclosing the code after first if upto second return in curly braces it is not giving me desired output.

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;
     
 }

Your code has if() and else statements. Each will execute one line of code that comes after them. This means that it will only execute a single statement and end after the first ; that it finds.

for() loops, while() loops, if-else blocks can be used without curly braces if the statement you want to execute consists of only one line of code following them.

Your code works as -

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;          
 }

This can be considered to be same as -

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;
}

NOTE: It is generally better if you use the braces as it will be good for readability as well as maintainability of the code. There can actually be two way of parsing it - Dangling else (though most compiler will associate the else with closest if ).

In this coding style, there's no way to differentiate between below two code -

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

and,

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

Since, in C/C++, it doesn't consider the indentation in code, so it might create ambiguity while reading the code. So its always better to use curly braces instead of doing it like above. Drop them only when you have a single line and it won't create any confusion reading the code later on...

Hope this helps !

Without curly braces, only the next statement is executed. With proper indentation it becomes easier to see what's going on:

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;
}

This is actually the same as:

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;
}

You have maybe used the braceless else variant without noticing it when writing something like:

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

Which is actually the same as

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

Without curly braces, the if guard only applies to the immediate next statement.
It's just how the language works. :/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM