What is the explanation?

T

Tadpole

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
 
S

santosh

Tadpole said:
Richard Delorme said:
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.
 
E

Ersek, Laszlo

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
 
W

Willem

Tadpole wrote:
)
) )> 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
 
S

Scott

Tadpole wrote:
)
) )> 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.
 
S

santosh

Tadpole said:
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.
 
W

Willem

Scott wrote:
) On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
)>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
 
N

Nick

Willem said:
Scott wrote:
) On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
)>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'
 
K

Kaz Kylheku

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

Scott

Scott wrote:
) On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
)>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.
 
S

Seebs

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
 
W

Willem

Scott wrote:
) On Sun, 28 Feb 2010 10:08:27 +0000 (UTC), in comp.lang.c, Willem
)
)>Scott wrote:
)>) On Sat, 27 Feb 2010 22:39:26 +0000 (UTC), in comp.lang.c, Willem
)>)>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
 
O

osmium

Kenneth said:
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?
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,767
Messages
2,569,570
Members
45,045
Latest member
DRCM

Latest Threads

Top