User_008
User_008

Reputation: 49

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

Upvotes: 0

Views: 93

Answers (3)

Ted Lyngmo
Ted Lyngmo

Reputation: 117812

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 {
        //
    }
}

Upvotes: 1

Abhishek Bhagate
Abhishek Bhagate

Reputation: 5786

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 !

Upvotes: 2

Thomas Ruble
Thomas Ruble

Reputation: 952

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

Upvotes: 0

Related Questions