> You appear to be reading the first sentence as being "a null pointer
> constant is some implementation-defined (or undefined) thing, which
> might be an integer constant expression with value 0, or might be such
> an expression cast to void *, or might be something else entirely".

The standard explicitly says that "NULL" is implementation defined.
It also says it is a null pointer constant.  It does not say it must
expand to the token "0".

[again, that doesn't stop an implementation from doing so even when
it's a bad idea]

So, I ask again - do you know of any platforms which we care about,
where you can't pass NULL to ... and have it work as expected?

> I'm reading it as "`null pointer constant' means anything that fits
> either [description A] or [description B]", as in "a father, or a
> mother, is called a parent".

That would be the converse to what is said in the standard, and not
guaranteed to be true.  Just because A is a B doesn't mean that B is
an A.

Consider (in your example) that there are other things which may be
parents (think "legal guardians"), and the word "mother" may not
always mean a parent (think motherboard, or mother-of-pearl).

> For what it may be worth, K&Rv2 seems to be closer to my
> interpretation than yours (page 102 says unadorned zero converts to
> a null pointer,

Not in something like "f += 0;" where f is type "float".

> However, your reading calls into question significant portions of the
> rest of the standard; for example, 6.3.2.1.1 says "An lvalue is an
> expression with an object type or an incomplete type other than void" -
> does this mean that an lvalue is one or the other of those or perhaps
> some third thing, and the implementation gets to pick which one?

No, it means that an lvalue is one of those things.  You're confusing
the logic; the above statement is completely different than the NPC
case.  The above is: An A is C or D.  The NPC case is: C or D is an A.
Just because these statements are true, does not mean their converses
are true.  Their contrapositives are true, though.

If you read "A or B must be foo" and later "C must be foo", it doesn't
imply that C must be A or B.  They could be members-of-sets, not
equalities.  Example: either 4 or 5 is an integer.  That doesn't mean
that all integers are 4 or 5.  "Red is a color" doesn't imply that all
colors are red.  "Red is the color" does (for that statement's
context).

> >> NULL *is* a "null pointer constant" in all contexts.
> > But the value 0 is NOT a null pointer constant in all contexts.
> 
> I believe it is, in that I see it as fitting the definition: it is "an
> integer constant expression with value 0, or [something else]".

Again, that clause is in the context of conversions to pointers.  If
you're converting to pointer, "0" is a NPC.  If you are not converting
to pointer, 0 might not be a NPC.

> > And before we start throwing qualifications around... I'm [...]
> 
> Was I throwing qualifications around?  I didn't think so.

I said *before* we start throwing :-)


_______________________________________________
geda-dev mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev

Reply via email to