The program that automatically grades my code is docking me "style-points" for an else-if that doesn't execute any code. It says that it may cause an error, but I don't think it could.
I'm not sure how to change it so that it still works but doesn't break the rule. Why is doing this bad form? I think any other way I write it will be harder for a reader to understand. How should it be written instead?
if (! seesWater(LEFT))
{
turn(LEFT);
}
else if (! seesWater(AHEAD));
else if (! seesWater(RIGHT))
{
turn(RIGHT);
}
else
{
turn180();
}
The reason the else-if is there but does nothing is because of the priority in which I want the code to act:
if (! seesWater(AHEAD))
, then I don't want the rest of the conditions to run at all because they don't matter.
Empty Statement in if … else Statement In the above code snippet, the if the condition has the empty body (or statement) as we have put a semicolon immediately after the if statement. Similar to loops, we can re-write the above code snippet as: int k = -1; if(k < 0)
Speaking of general if-else blocks, it is not necessary to have an empty else block. Not including an empty else block does not make the code any more unsafe and including an empty else block does not make the code any more safe.
Conditional Statements Use if to specify a block of code to be executed, if a specified condition is true. Use else to specify a block of code to be executed, if the same condition is false. Use else if to specify a new condition to test, if the first condition is false.
The Ternary Operator One of my favourite alternatives to if...else is the ternary operator. Here expressionIfTrue will be evaluated if condition evaluates to true ; otherwise expressionIfFalse will be evaluated. The beauty of ternary operators is they can be used on the right-hand side of an assignment.
Who says it's "bad style"?
The relevant question to ask is, is this clearer than alternatives? In your specific case, I'd say it is. The code clearly expresses a choice between 4 options, of which one is "do nothing".
The only change I'd make is to replace that rather insignificant semicolon by an empty pair of braces, possibly with a comment to make it clear it's not a mistake.
if (! seesWater(LEFT)) {
turn(LEFT);
}
else if (! seesWater(AHEAD)) {
// nothing required
}
else if (! seesWater(RIGHT)) {
turn(RIGHT);
}
else {
turn180();
}
This is not endorsing 'empty clauses' as a generally-acceptable style; merely that cases should be argued on their merits, not on the basis of some Rule That Must Be Obeyed. It is a matter of developing good taste, and the judgement of taste is for humans, not mindless automata.
If this is the logic you want, there is nothing wrong with your code. In terms of code styling wise, I agree with the other users. Something like this would be clearer in my opinion:
if (! seesWater(LEFT))
{
turn(LEFT);
}
else if (! seesWater(AHEAD))
{
//Do nothing
}
else if (! seesWater(RIGHT))
{
turn(RIGHT);
}
else
{
turn180();
}
But by having priority of making a left turn over moving ahead (by doing nothing), the movement may end up in circles:
If you want the movement to "do nothing" but avoid moving into waters like this:
You may want to change your logic to something like this:
if (! seesWater(AHEAD))
{
//Do nothing. Keep moving
}
else if (! seesWater(LEFT))
{
turn(LEFT);
}
else if (! seesWater(RIGHT))
{
turn(RIGHT);
}
else
{
turn180();
}
You can invert the ! seesWater(AHEAD)
condition. Then you can move the code in its else
clause to its if
clause:
if (! seesWater(LEFT))
{
turn(LEFT);
}
else if (seesWater(AHEAD))
{
if (! seesWater(RIGHT))
{
turn(RIGHT);
}
else
{
turn180();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With