What is the explanation?

Discussion in 'C Programming' started by Tadpole, Feb 27, 2010.

  1. Tadpole

    Tadpole Guest

    Hi,
    Can anyone explain what is happening?
    int x=0;
    srand (time(NULL));
    for (int i=0;i <100; i++)
    {x =rand ()%9;
    if ( x !=( 7||8))
    printf ("%d ",x);
    }

    Result of Print
    5 8 7 4 8 3 0 7 2 8 2 7 6 7 5 7 8 3 0 0 6 5 0 4 7 6 5 8 5 2 0 2 0 6 4 8 7 3
    2 6
    2 3 6 2 3 7 2 5 5 6 3 7 2 3 7 4 4 2 5 6 0 4 5 4 4 5 0 5 6 7 5 3 6 3 2 0 5 0
    0 5
    7 5 8 6 3 2 2 8 3 6 8
    Press any key to continue . . .

    Question 1 : Why is 1 missing here?


    int x=0;
    srand (time(NULL));
    for (int i=0;i <100; i++)
    {x =rand ()%9;
    if ( (x != 7) || (x != 8))
    printf ("%d ",x);
    }

    Result of print
    3 1 2 8 5 6 2 4 8 2 8 3 1 4 8 6 1 6 7 1 0 4 7 4 0 6 4 8 5 8 2 0 1 1 7 8 2 6
    7 7
    0 3 1 2 1 6 2 4 1 2 1 8 2 0 2 7 8 8 1 6 0 5 3 1 3 7 3 3 6 5 2 1 2 4 7 3 6 6
    3 0
    4 2 2 1 4 1 7 1 4 4 3 4 8 0 7 1 2 6 4 7
    Press any key to continue . . .

    Question 2 : I dont want 7 and 8 to be printed. X is not to be 7 or 8.
    But why they are still printed?
    What is the correct statement to write?

    Thank you
    Khoon
     
    Tadpole, Feb 27, 2010
    #1
    1. Advertising

  2. In article <4b88b869$>, Tadpole <> wrote:
    >if ( (x != 7) || (x != 8))


    &&

    --bks
     
    Bradley K. Sherman, Feb 27, 2010
    #2
    1. Advertising

  3. Tadpole

    Tadpole Guest

    Thank you Teacher.
    I got it


    "Bradley K. Sherman" <> wrote in message
    news:hmadkb$9gg$...
    > In article <4b88b869$>, Tadpole <>
    > wrote:
    >>if ( (x != 7) || (x != 8))

    >
    > &&
    >
    > --bks
    >
     
    Tadpole, Feb 27, 2010
    #3
  4. Le 27/02/2010 07:16, Tadpole a écrit :

    [...]
    > if ( x !=( 7||8))


    > Question 1 : Why is 1 missing here?


    The value of (7||8) is 1.

    --
    Richard
     
    Richard Delorme, Feb 27, 2010
    #4
  5. Tadpole

    Tadpole Guest

    "Richard Delorme" <> wrote in message
    news:4b88d21a$0$17882$...
    > Le 27/02/2010 07:16, Tadpole a écrit :
    >
    > [...]
    >> if ( x !=( 7||8))

    >
    >> Question 1 : Why is 1 missing here?

    >
    > The value of (7||8) is 1.
    >
    > --
    > Richard


    Hi Richard,
    Kindly explain why or how (7||8) is 1 ?
    I am amazed.

    Khoon
     
    Tadpole, Feb 27, 2010
    #5
  6. Tadpole

    santosh Guest

    Tadpole <> writes:
    > "Richard Delorme" <> wrote in message
    > news:4b88d21a$0$17882$...
    >> Le 27/02/2010 07:16, Tadpole a �crit :
    >>
    >> [...]
    >>> if ( x !=( 7||8))

    >>
    >>> Question 1 : Why is 1 missing here?

    >>
    >> The value of (7||8) is 1.


    > Hi Richard,
    > Kindly explain why or how (7||8) is 1 ?
    > I am amazed.


    The specs say so is the brief answer:

    6.5.14 Logical OR operator
    Syntax
    1 logical-OR-expression:
    logical-AND-expression
    logical-OR-expression || logical-AND-expression
    Constraints
    2 Each of the operands shall have scalar type.

    Semantics
    3 The || operator shall yield 1 if either of its operands compare
    unequal to 0; otherwise, it yields 0. The result has type int.

    The && and || operators also perform left to right evaluation and if
    the condition is met by the first operand itself, they will not
    evaluate the rest of the operands. So in this case the literal 7 is
    unequal to zero (C's value for boolean false), so the expression
    yields one.
     
    santosh, Feb 27, 2010
    #6
  7. Tadpole

    Seebs Guest

    Seebs, Feb 27, 2010
    #7
  8. In article <>, Seebs <> writes:
    > On 2010-02-27, Tadpole <> wrote:
    >> Kindly explain why or how (7||8) is 1 ?

    >
    > All non-zero values are true. (x||y) is 1 if either x is true or y is true.


    .... or both are true.

    (Or perhaps my English is failing me; in that case, sorry.)

    lacos
     
    Ersek, Laszlo, Feb 27, 2010
    #8
  9. Tadpole

    Seebs Guest

    On 2010-02-27, Ersek, Laszlo <> wrote:
    > In article <>, Seebs <> writes:
    >> On 2010-02-27, Tadpole <> wrote:
    >>> Kindly explain why or how (7||8) is 1 ?

    >>
    >> All non-zero values are true. (x||y) is 1 if either x is true or y is true.

    >
    > ... or both are true.
    >
    > (Or perhaps my English is failing me; in that case, sorry.)


    English in general is failing you; the word "or" is ambiguous.

    -s
    --
    Copyright 2010, all wrongs reversed. Peter Seebach /
    http://www.seebs.net/log/ <-- lawsuits, religion, and funny pictures
    http://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated!
     
    Seebs, Feb 27, 2010
    #9
  10. Tadpole

    Willem Guest

    Tadpole wrote:
    )
    ) "Richard Delorme" <> wrote in message
    ) news:4b88d21a$0$17882$...
    )> Le 27/02/2010 07:16, Tadpole a ?crit :
    )>
    )> [...]
    )>> if ( x !=( 7||8))
    )>
    )>> Question 1 : Why is 1 missing here?
    )>
    )> The value of (7||8) is 1.
    )>
    )> --
    )> Richard
    )
    ) Hi Richard,
    ) Kindly explain why or how (7||8) is 1 ?
    ) I am amazed.

    What do you expect the value of (7||8) to be ?


    SaSW, Willem
    --
    Disclaimer: I am in no way responsible for any of the statements
    made in the above text. For all I know I might be
    drugged or something..
    No I'm not paranoid. You all think I'm paranoid, don't you !
    #EOT
     
    Willem, Feb 27, 2010
    #10
  11. Tadpole

    Scott Guest

    On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
    <> wrote:

    >Tadpole wrote:
    >)
    >) "Richard Delorme" <> wrote in message
    >) news:4b88d21a$0$17882$...
    >)> Le 27/02/2010 07:16, Tadpole a ?crit :
    >)>
    >)> [...]
    >)>> if ( x !=( 7||8))
    >)>
    >)>> Question 1 : Why is 1 missing here?
    >)>
    >)> The value of (7||8) is 1.
    >)>
    >)> --
    >)> Richard
    >)
    >) Hi Richard,
    >) Kindly explain why or how (7||8) is 1 ?
    >) I am amazed.
    >
    >What do you expect the value of (7||8) to be ?


    I would not expect it to be 1. I would just expect it to not be zero.
     
    Scott, Feb 28, 2010
    #11
  12. Tadpole

    Tadpole Guest

    >>)
    >>) Hi Richard,
    >>) Kindly explain why or how (7||8) is 1 ?
    >>) I am amazed.
    >>
    >>What do you expect the value of (7||8) to be ?

    >
    > I would not expect it to be 1. I would just expect it to not be zero.


    No. The answer is always 1. . I have tested it and it gives me 1 and no
    other number.
     
    Tadpole, Feb 28, 2010
    #12
  13. Tadpole

    santosh Guest

    Tadpole <> writes:

    >>>)
    >>>) Hi Richard,
    >>>) Kindly explain why or how (7||8) is 1 ?
    >>>) I am amazed.
    >>>
    >>>What do you expect the value of (7||8) to be ?

    >>
    >> I would not expect it to be 1. I would just expect it to not be
    >> zero.

    >
    > No. The answer is always 1. . I have tested it and it gives me 1
    > and no other number.


    In such matters of minutiae, it's often better to actually check the
    standard rather than check the visible behaviour of your particular
    compiler.

    But in this case, the standard mandates that the || op yield 1 if
    either of it's operands is non-zero. I guess it's restricted to 1,
    and not any non-zero value, for consistency and aesthetics.
     
    santosh, Feb 28, 2010
    #13
  14. Tadpole

    Willem Guest

    Scott wrote:
    ) On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
    )<> wrote:
    )>What do you expect the value of (7||8) to be ?
    )
    ) I would not expect it to be 1. I would just expect it to not be zero.

    Perhaps you should switch to Perl. There, (a||b) is defined as (a?a:b)
    (But, obviously, with a only being evaluated once).
    And, incidentally, (a&&b) is defined as (a?b:a).

    In C, the result of any boolean operator is always 0 or 1.
    Dunno why, perhaps because existing compilers did it that way and
    code existed that used the result of the boolean for arithmetics.


    SaSW, Willem
    --
    Disclaimer: I am in no way responsible for any of the statements
    made in the above text. For all I know I might be
    drugged or something..
    No I'm not paranoid. You all think I'm paranoid, don't you !
    #EOT
     
    Willem, Feb 28, 2010
    #14
  15. Tadpole

    Nick Guest

    Willem <> writes:

    > Scott wrote:
    > ) On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
    > )<> wrote:
    > )>What do you expect the value of (7||8) to be ?
    > )
    > ) I would not expect it to be 1. I would just expect it to not be zero.
    >
    > Perhaps you should switch to Perl. There, (a||b) is defined as (a?a:b)
    > (But, obviously, with a only being evaluated once).
    > And, incidentally, (a&&b) is defined as (a?b:a).
    >
    > In C, the result of any boolean operator is always 0 or 1.
    > Dunno why, perhaps because existing compilers did it that way and
    > code existed that used the result of the boolean for arithmetics.


    Spectrum Basic did that well before Perl IIRC. Useful for writing
    things like:
    PRINT a$ OR 'nothing'
    --
    Online waterways route planner | http://canalplan.eu
    Plan trips, see photos, check facilities | http://canalplan.org.uk
     
    Nick, Feb 28, 2010
    #15
  16. Tadpole

    Kaz Kylheku Guest

    On 2010-02-28, Nick <> wrote:
    > Spectrum Basic did that well before Perl IIRC. Useful for writing
    > things like:
    > PRINT a$ OR 'nothing'


    Lisp!

    (or a1 a2 a3 ... an)

    The arguments ai are evaluated in order, stopping at the first one which
    yields true (a value other than nil), in which case that value is the
    result. Otherwise, the result is nil.

    This feature is described in the Lisp 1.5 manual whose preface is dated
    August 17, 1962. (Appendix A, Functions and Constants in the LISP
    System).
     
    Kaz Kylheku, Feb 28, 2010
    #16
  17. Tadpole

    Scott Guest

    On Sun, 28 Feb 2010 10:08:27 +0000 (UTC), in comp.lang.c, Willem
    <> wrote:

    >Scott wrote:
    >) On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
    >)<> wrote:
    >)>What do you expect the value of (7||8) to be ?
    >)
    >) I would not expect it to be 1. I would just expect it to not be zero.
    >
    >Perhaps you should switch to Perl.


    Eh. No. Just...no.

    >In C, the result of any boolean operator is always 0 or 1.
    >Dunno why, perhaps because existing compilers did it that way and
    >code existed that used the result of the boolean for arithmetics.


    Yes, yet writing C according to my stated assumption above still yeilds
    semantically correct code. And it keeps me in the right frame of mind,
    without having to stop to think about it, to handle languages where
    "true==1" isn't necessarily so, ultimately producing fewer bugs.
     
    Scott, Feb 28, 2010
    #17
  18. Tadpole

    Seebs Guest

    On 2010-02-28, Willem <> wrote:
    > Perhaps you should switch to Perl. There, (a||b) is defined as (a?a:b)
    > (But, obviously, with a only being evaluated once).
    > And, incidentally, (a&&b) is defined as (a?b:a).


    Ruby is the same way, at least with ||.

    > In C, the result of any boolean operator is always 0 or 1.


    PHP is the same way, at least with ||.

    .... Note that if you happen to be doing two projects, both web based, one in
    Ruby and one in PHP, this is a particularly irritating difference.

    Although it's an extension, GNU C has a very nice way to express that:
    a ?: b

    I actually sorta wish that ISO C would pick that one up, it's very expressive.

    -s
    --
    Copyright 2010, all wrongs reversed. Peter Seebach /
    http://www.seebs.net/log/ <-- lawsuits, religion, and funny pictures
    http://en.wikipedia.org/wiki/Fair_Game_(Scientology) <-- get educated!
     
    Seebs, Feb 28, 2010
    #18
  19. Tadpole

    Willem Guest

    Scott wrote:
    ) On Sun, 28 Feb 2010 10:08:27 +0000 (UTC), in comp.lang.c, Willem
    )<> wrote:
    )
    )>Scott wrote:
    )>) On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
    )>)<> wrote:
    )>)>What do you expect the value of (7||8) to be ?
    )>)
    )>) I would not expect it to be 1. I would just expect it to not be zero.
    )>
    )>Perhaps you should switch to Perl.
    )
    ) Eh. No. Just...no.
    )
    )>In C, the result of any boolean operator is always 0 or 1.
    )>Dunno why, perhaps because existing compilers did it that way and
    )>code existed that used the result of the boolean for arithmetics.
    )
    ) Yes, yet writing C according to my stated assumption above still yeilds
    ) semantically correct code. And it keeps me in the right frame of mind,
    ) without having to stop to think about it, to handle languages where
    ) "true==1" isn't necessarily so, ultimately producing fewer bugs.

    I was under the mistaken impression that I was talking to the same person
    who was amazed that (7||8) yielded 1. You know, the one that my question
    was directed to. Of course, I should have checked the name. My apology.


    SaSW, Willem
    --
    Disclaimer: I am in no way responsible for any of the statements
    made in the above text. For all I know I might be
    drugged or something..
    No I'm not paranoid. You all think I'm paranoid, don't you !
    #EOT
     
    Willem, Feb 28, 2010
    #19
  20. Tadpole

    osmium Guest

    Kenneth Brody wrote:

    > On 2/27/2010 1:16 AM, Tadpole wrote:
    > [...]
    >> if ( (x != 7) || (x != 8))
    >> printf ("%d ",x);

    > [...]
    >> Question 2 : I dont want 7 and 8 to be printed. X is not to be 7
    >> or 8. But why they are still printed?

    >
    > Because 8 it not equal to 7, and 7 is not equal to 8. It is not
    > possible for "x != 7" and "x != 8" to both be false.
    >
    >> What is the correct statement to write?

    >
    > if ( (x != 7) && (x != 8) )
    >
    >
    > To a computer, the concepts of "and" and "or" are not exactly the
    > same as in spoken human communication.
    >
    > Consider "show me a list of clients living in New York and New
    > Jersey". If you tell a computer:
    >
    > if ( state == state_NY && state == state_NJ )
    >
    > you're not going to get very many hits, because the state cannot be
    > both New York _and_ New Jersey at the same time.
    >
    > The "correct" way to ask is "show me a list of clients whose address
    > is either New York _or_ New Jersey":
    >
    > if ( state == state_NY || state == state_NJ )


    Which ignores the point made upstream that the English language is ambiguous
    WRT the word "or".

    Do you want a Coke or a Pepsi?
     
    osmium, Mar 1, 2010
    #20
    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. Mariusz

    explanation

    Mariusz, Jan 12, 2004, in forum: VHDL
    Replies:
    1
    Views:
    611
    tbx135
    Jan 13, 2004
  2. Kaladhaur Palaniappa

    Need Explanation

    Kaladhaur Palaniappa, Aug 7, 2003, in forum: Perl
    Replies:
    0
    Views:
    1,023
    Kaladhaur Palaniappa
    Aug 7, 2003
  3. Benjie Fallar

    tracing output explanation

    Benjie Fallar, Jul 15, 2003, in forum: ASP .Net
    Replies:
    0
    Views:
    370
    Benjie Fallar
    Jul 15, 2003
  4. George Ter-Saakov

    Do you have an explanation for this?

    George Ter-Saakov, Apr 29, 2004, in forum: ASP .Net
    Replies:
    1
    Views:
    609
    Pravin A. Sable
    Apr 30, 2004
  5. Dave
    Replies:
    4
    Views:
    407
Loading...

Share This Page