More on the cosmetics (if-statements)

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

  1. desktop

    desktop Guest

    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.
     
    desktop, May 31, 2007
    #1
    1. Advertising

  2. 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
    > your pro's and con's.


    /* 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
    #2
    1. Advertising

  3. desktop

    terminator Guest

    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.
     
    terminator, May 31, 2007
    #3
  4. 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
    #4
  5. desktop

    Ron Natalie Guest

    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
    #5
  6. desktop

    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
    > your pro's and con's.


    If those are the only two options I have to choose from, then A.
     
    Daniel T., May 31, 2007
    #6
  7. desktop

    desktop Guest

    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.
    >


    Ok but what about this (assuming that there is no such thing as a 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";
    }



    /* INSTEAD OF:*/

    /* 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
    #7
  8. desktop

    Andre Kostur Guest

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

    >
    > Ok but what about this (assuming that there is no such thing as a
    > 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";
    > }
    >
    >
    >
    > /* INSTEAD OF:*/
    >
    > /* 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
    #8
  9. 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.


    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
    #9
  10. Andre Kostur wrote:
    > desktop <> wrote in news:f3mgvl$med$-c.dk:
    >
    >>
    >> Ok but what about this (assuming that there is no such thing as a
    >> 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";
    >> }
    >>
    >>
    >>
    >> /* INSTEAD OF:*/
    >>
    >> /* 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
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask
     
    Victor Bazarov, May 31, 2007
    #10
  11. Victor Bazarov wrote :
    > Andre Kostur wrote:
    >> desktop <> wrote in news:f3mgvl$med$-c.dk:
    >>
    >>>
    >>> Ok but what about this (assuming that there is no such thing as a
    >>> 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";
    >>> }
    >>>
    >>>
    >>>
    >>> /* INSTEAD OF:*/
    >>>
    >>> /* 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
    #11
  12. desktop

    Puppet_Sock Guest

    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
    #12
  13. desktop

    Puppet_Sock Guest

    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
    #13
  14. desktop

    James Kanze Guest

    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
    #14
  15. desktop

    James Kanze Guest

    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.


    > Ok but what about this (assuming that there is no such thing as a 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";
    > }


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

    > /* INSTEAD OF:*/


    > /* 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
    #15
  16. desktop

    Jerry Coffin Guest

    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
    #16
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Neil Zanella
    Replies:
    8
    Views:
    1,208
    mfmehdi
    Oct 20, 2006
  2. Harry George
    Replies:
    6
    Views:
    417
    Bart Nessux
    Feb 23, 2004
  3. Vince
    Replies:
    12
    Views:
    762
    Martin Gregorie
    Jan 21, 2008
  4. Paul E
    Replies:
    3
    Views:
    106
    Roland Hall
    Aug 19, 2004
  5. John Crichton
    Replies:
    6
    Views:
    271
    John Crichton
    Jul 12, 2010
Loading...

Share This Page