# More on the cosmetics (if-statements)

Discussion in 'C++' started by desktop, May 31, 2007.

1. ### desktopGuest

Which would you prefer:

/* A */

int k = 402;
if ( k == 40) {
std::cout << "40\n";
} else {
std::cout << "Not 40\n";
}

/* B */
if ( k == 40) std::cout << "40\n";
else std::cout << "Not 40\n";

I know it depends on taste but I am just curious and would like to hear

desktop, May 31, 2007

2. ### Michael DOUBEZGuest

desktop a écrit :
> Which would you prefer:
>
> /* A */
>
> int k = 402;
> if ( k == 40) {
> std::cout << "40\n";
> } else {
> std::cout << "Not 40\n";
> }
>
>
> /* B */
> if ( k == 40) std::cout << "40\n";
> else std::cout << "Not 40\n";
>
>
> I know it depends on taste but I am just curious and would like to hear

/* C */
// ...
const int magic_k = 402;
// ...
const int special_k = 40;
//k is ...
int k = magic_k;
//
if ( special_k == k )
{
std::cout << "40\n";
}
else
{
std::cout << "Not 40\n";
}

As for proposition B, it was explicitely forbidden in internal norm in
the last two compagny I've been.

Michael

Michael DOUBEZ, May 31, 2007

3. ### terminatorGuest

On May 31, 3:13 pm, desktop <> wrote:
> Which would you prefer:
>
> /* A */
>
> int k = 402;
> if ( k == 40) {
> std::cout << "40\n";
> } else {
> std::cout << "Not 40\n";
> }
>
> /* B */
> if ( k == 40) std::cout << "40\n";
> else std::cout << "Not 40\n";
>
> I know it depends on taste but I am just curious and would like to hear

for the sake of maintanance and later correction/improvement 'A' is
better ;it prevents algorithmic errors due to later editing and
forggeting braces.

terminator, May 31, 2007
4. ### Sylvester HespGuest

desktop wrote :
> Which would you prefer:
>
> /* A */
>
> int k = 402;
> if ( k == 40) {
> std::cout << "40\n";
> } else {
> std::cout << "Not 40\n";
> }
>
>
> /* B */
> if ( k == 40) std::cout << "40\n";
> else std::cout << "Not 40\n";
>
>
> I know it depends on taste but I am just curious and would like to hear your
> pro's and con's.

/* C */
if (k == 40)
std::cout << "40\n";
else
std::cout << "Not 40\n";

I'd like to have braces on separate lines, but for compound statements
with only a single inner statement that produces too much clutter, so I
won't use braces for those.

Pro: it looks cleaner (to me at least)
Con: you'll have to add the braces when extending the statements, which
can be forgotten

- Sylvester

Sylvester Hesp, May 31, 2007
5. ### Ron NatalieGuest

terminator wrote:
\
> for the sake of maintanance and later correction/improvement 'A' is
> better ;it prevents algorithmic errors due to later editing and
> forggeting braces.
>

Further it makes use of debuggers a lot easier. Most of the
popular ones I've used (Micrsoft, gdb, Sun) all deal with
"lines" as their resolution (unless you switch to instructions).
By putting things all on one line, it's hard to break/step on
the if condition test separately from the attached statement.

Ron Natalie, May 31, 2007
6. ### Daniel T.Guest

desktop <> wrote:

> Which would you prefer:
>
> /* A */
>
> int k = 402;
> if ( k == 40) {
> std::cout << "40\n";
> } else {
> std::cout << "Not 40\n";
> }
>
>
> /* B */
> if ( k == 40) std::cout << "40\n";
> else std::cout << "Not 40\n";
>
>
> I know it depends on taste but I am just curious and would like to hear

If those are the only two options I have to choose from, then A.

Daniel T., May 31, 2007
7. ### desktopGuest

terminator wrote:
> On May 31, 3:13 pm, desktop <> wrote:
>> Which would you prefer:
>>
>> /* A */
>>
>> int k = 402;
>> if ( k == 40) {
>> std::cout << "40\n";
>> } else {
>> std::cout << "Not 40\n";
>> }
>>
>> /* B */
>> if ( k == 40) std::cout << "40\n";
>> else std::cout << "Not 40\n";
>>
>> I know it depends on taste but I am just curious and would like to hear

>
> for the sake of maintanance and later correction/improvement 'A' is
> better ;it prevents algorithmic errors due to later editing and
> forggeting braces.
>

int k = 40;

/* Case 1. */
if (k == 10) {
std::cout << "1\n";
} else
/* Case 2. */
if (k == 20) {
std::cout << "2\n";
} else
/* Case 3. */
if (k == 30) {
std::cout << "3\n";
} else
/* Case 4. */
if (k == 40) {
std::cout << "4\n";
}

/* Case 1: Only 1 element in the list. */
if (k == 10) {
std::cout << "1\n";
} else {
if (k == 20) {
std::cout << "2\n";
} else {
if (k == 30) {
std::cout << "3\n";
} else {
if (k == 40) {
std::cout << "4\n";
}
}
}
}

desktop, May 31, 2007
8. ### Andre KosturGuest

desktop <> wrote in news:f3mgvl\$med\$-c.dk:

>
> switch):
>
>
> int k = 40;
>
> /* Case 1. */
> if (k == 10) {
> std::cout << "1\n";
> } else
> /* Case 2. */
> if (k == 20) {
> std::cout << "2\n";
> } else
> /* Case 3. */
> if (k == 30) {
> std::cout << "3\n";
> } else
> /* Case 4. */
> if (k == 40) {
> std::cout << "4\n";
> }
>
>
>
>
> /* Case 1: Only 1 element in the list. */
> if (k == 10) {
> std::cout << "1\n";
> } else {
> if (k == 20) {
> std::cout << "2\n";
> } else {
> if (k == 30) {
> std::cout << "3\n";
> } else {
> if (k == 40) {
> std::cout << "4\n";
> }
> }
> }
> }

Neither:

if (k == 10)
{
std::cout << "1\n";
}
else if (k == 20)
{
std::cout << "2\n";
}
else if (k == 30)
{
std::cout << "3\n";
}
else if (k == 40)
{
std::cout << "4\n";
}

Andre Kostur, May 31, 2007
9. ### Jacek DziedzicGuest

desktop wrote:
> Which would you prefer:
>
> /* A */
>
> int k = 402;
> if ( k == 40) {
> std::cout << "40\n";
> } else {
> std::cout << "Not 40\n";
> }
>
>
> /* B */
> if ( k == 40) std::cout << "40\n";
> else std::cout << "Not 40\n";
>
>
> I know it depends on taste but I am just curious and would like to hear

Guess I'm the only one who'd go for /*B*/. Some people dislike
it, because they tend to forget to add braces when they need to
extend the 'if' or 'else' to more statements. To me, a single
'if' or 'else' line rings an alarm bell that beeps "add the braces"
whenever I modify it.

- J.

Jacek Dziedzic, May 31, 2007
10. ### Victor BazarovGuest

Andre Kostur wrote:
> desktop <> wrote in news:f3mgvl\$med\$-c.dk:
>
>>
>> switch):
>>
>>
>> int k = 40;
>>
>> /* Case 1. */
>> if (k == 10) {
>> std::cout << "1\n";
>> } else
>> /* Case 2. */
>> if (k == 20) {
>> std::cout << "2\n";
>> } else
>> /* Case 3. */
>> if (k == 30) {
>> std::cout << "3\n";
>> } else
>> /* Case 4. */
>> if (k == 40) {
>> std::cout << "4\n";
>> }
>>
>>
>>
>>
>> /* Case 1: Only 1 element in the list. */
>> if (k == 10) {
>> std::cout << "1\n";
>> } else {
>> if (k == 20) {
>> std::cout << "2\n";
>> } else {
>> if (k == 30) {
>> std::cout << "3\n";
>> } else {
>> if (k == 40) {
>> std::cout << "4\n";
>> }
>> }
>> }
>> }

>
> Neither:
>
> if (k == 10)
> {
> std::cout << "1\n";
> }
> else if (k == 20)
> {
> std::cout << "2\n";
> }
> else if (k == 30)
> {
> std::cout << "3\n";
> }
> else if (k == 40)
> {
> std::cout << "4\n";
> }

For unsigned 'k':

std::cout << "01234"[k / 10 % 5] << "\n";

V
--

Victor Bazarov, May 31, 2007
11. ### Sylvester HespGuest

Victor Bazarov wrote :
> Andre Kostur wrote:
>> desktop <> wrote in news:f3mgvl\$med\$-c.dk:
>>
>>>
>>> switch):
>>>
>>>
>>> int k = 40;
>>>
>>> /* Case 1. */
>>> if (k == 10) {
>>> std::cout << "1\n";
>>> } else
>>> /* Case 2. */
>>> if (k == 20) {
>>> std::cout << "2\n";
>>> } else
>>> /* Case 3. */
>>> if (k == 30) {
>>> std::cout << "3\n";
>>> } else
>>> /* Case 4. */
>>> if (k == 40) {
>>> std::cout << "4\n";
>>> }
>>>
>>>
>>>
>>>
>>> /* Case 1: Only 1 element in the list. */
>>> if (k == 10) {
>>> std::cout << "1\n";
>>> } else {
>>> if (k == 20) {
>>> std::cout << "2\n";
>>> } else {
>>> if (k == 30) {
>>> std::cout << "3\n";
>>> } else {
>>> if (k == 40) {
>>> std::cout << "4\n";
>>> }
>>> }
>>> }
>>> }

>>
>> Neither:
>>
>> if (k == 10)
>> {
>> std::cout << "1\n";
>> }
>> else if (k == 20)
>> {
>> std::cout << "2\n";
>> }
>> else if (k == 30)
>> {
>> std::cout << "3\n";
>> }
>> else if (k == 40)
>> {
>> std::cout << "4\n";
>> }

>
> For unsigned 'k':
>
> std::cout << "01234"[k / 10 % 5] << "\n";
>
>
>
> V

Which is not really the same if 'k' is not either one of the values in
the if statements

- Sylvester

Sylvester Hesp, May 31, 2007
12. ### Puppet_SockGuest

On May 31, 7:52 am, Michael DOUBEZ <> wrote:
[snip]
> /* C */
> // ...
> const int magic_k = 402;
> // ...
> const int special_k = 40;
> //k is ...
> int k = magic_k;
> //
> if ( special_k == k )
> {
> std::cout << "40\n";

Whoops! There's your magic number back again. You want
something resembling the following.

std::cout << special_k << "\n";

Or some such.

> }
> else
> {
> std::cout << "Not 40\n";

Same kind of comment.
Socks

Puppet_Sock, May 31, 2007
13. ### Puppet_SockGuest

On May 31, 7:13 am, desktop <> wrote:
> Which would you prefer:

[brackets or no brackets for single line of if]

As Michael said, option C.

It may simply be the kind of engineering projects I've
been involved in over the last few years. But one of the
principles that gets drilled on pretty harshly is, for
every task you must define the start and end of the task
before you actually start the task.

So I alwasy type things in the following way. When I'm
going to put in an "if" statement, first I type this.

if()
{
}

That is, I define the scaffold that provides the bounds.
Then I fill in the condition inside the if() part.
Then I put the lines of code between the { and },
and I do this even if I expect there to be only one
line of code.

I do much the same thing for functions. Say I'm going
to have a function called myFunc. First I type this.

myFunc()
{
}

Then I fill in the return type, then the argument list,
then I start on the code. Same for while, for, etc.
Socks

Puppet_Sock, May 31, 2007
14. ### James KanzeGuest

On May 31, 1:13 pm, desktop <> wrote:
> Which would you prefer:

> /* A */
>
> int k = 402;
> if ( k == 40) {
> std::cout << "40\n";
> } else {
> std::cout << "Not 40\n";
> }

> /* B */
> if ( k == 40) std::cout << "40\n";
> else std::cout << "Not 40\n";

> I know it depends on taste

Only up to a certain point: B is not acceptable anywhere.

But different places have different conventions regarding
braces, and while I tend to use something like your A, the exact
placement of braces really is a question of personal taste.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

James Kanze, Jun 1, 2007
15. ### James KanzeGuest

On May 31, 3:01 pm, desktop <> wrote:
> terminator wrote:
> > On May 31, 3:13 pm, desktop <> wrote:
> >> Which would you prefer:

> >> /* A */

> >> int k = 402;
> >> if ( k == 40) {
> >> std::cout << "40\n";
> >> } else {
> >> std::cout << "Not 40\n";
> >> }

> >> /* B */
> >> if ( k == 40) std::cout << "40\n";
> >> else std::cout << "Not 40\n";

> >> I know it depends on taste but I am just curious and would like to hear
> >> your pro's and con's.

> > for the sake of maintanance and later correction/improvement 'A' is
> > better ;it prevents algorithmic errors due to later editing and
> > forggeting braces.

> int k = 40;

> /* Case 1. */
> if (k == 10) {
> std::cout << "1\n";
> } else
> /* Case 2. */
> if (k == 20) {
> std::cout << "2\n";
> } else
> /* Case 3. */
> if (k == 30) {
> std::cout << "3\n";
> } else
> /* Case 4. */
> if (k == 40) {
> std::cout << "4\n";
> }

Why the extra lines?
if (k == 10) {
std::cout << "1\n";
} else if (k == 20) {
std::cout << "2\n";
} else if (k == 30) {
std::cout << "3\n";
} else if (k == 40) {
std::cout << "4\n";
}

> /* Case 1: Only 1 element in the list. */
> if (k == 10) {
> std::cout << "1\n";
> } else {
> if (k == 20) {
> std::cout << "2\n";
> } else {
> if (k == 30) {
> std::cout << "3\n";
> } else {
> if (k == 40) {
> std::cout << "4\n";
> }
> }
> }
> }

And why all the extra nesting. "else if" is pretty much a
recognized concept. Languages like Modula or Ada, which
force bracing the controled statements, almost always have an
elsif concept. C++ doesn't have it because it doesn't need
anything special to simulate the same construction.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

James Kanze, Jun 1, 2007
16. ### Jerry CoffinGuest

In article <f3malc\$llk\$-c.dk>, says...
> Which would you prefer:
>
> /* A */
>
> int k = 402;
> if ( k == 40) {
> std::cout << "40\n";
> } else {
> std::cout << "Not 40\n";
> }
>
>
> /* B */
> if ( k == 40) std::cout << "40\n";
> else std::cout << "Not 40\n";

Like most, I prefer option C (or somewhere around option J, based on the
number of "C" options already presented):

std::cout << (k == 40 ? "40\n" : "Not 40\n");

or using a bit of boolean math:

std::string outputs[] = {"Not 40\n", "40\n"};

std::cout << outputs[k==40];

or getting tricky with the boolean math:

std::cout << "Not 40\n"+4*(k==40);

Though I'm honsetly not sure I'd consider this one advisable...

Between the two you presented, I'd consider A reasonable, and B
unacceptable.

--
Later,
Jerry.

The universe is a figment of its own imagination.

Jerry Coffin, Jun 3, 2007