Deutsch   English   Français   Italiano  
<87mslhgqb3.fsf@nosuchdomain.example.com>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!weretis.net!feeder8.news.weretis.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: Keith Thompson <Keith.S.Thompson+u@gmail.com>
Newsgroups: comp.lang.c
Subject: Re: question about nullptr
Date: Mon, 12 Aug 2024 18:33:04 -0700
Organization: None to speak of
Lines: 87
Message-ID: <87mslhgqb3.fsf@nosuchdomain.example.com>
References: <v6bavg$3pu5i$1@dont-email.me> <20240706054641.175@kylheku.com>
	<v6bfi1$3qn4u$1@dont-email.me> <l9ciO.7$cr5e.2@fx05.iad>
	<877cdyuq0f.fsf@bsb.me.uk> <2ckiO.19403$7Ej.4487@fx46.iad>
	<87plrpt4du.fsf@bsb.me.uk> <9bCiO.7108$sXW9.3805@fx41.iad>
	<877cdwu9s1.fsf@nosuchdomain.example.com>
	<20240708222804.00001654@yahoo.com> <86le2b9ru6.fsf@linuxsc.com>
	<8734ojxlg7.fsf@nosuchdomain.example.com> <86msmp8fld.fsf@linuxsc.com>
	<87cynluekl.fsf@nosuchdomain.example.com>
	<v6n36o$239h6$2@dont-email.me> <861q2t1ce8.fsf@linuxsc.com>
MIME-Version: 1.0
Content-Type: text/plain
Injection-Date: Tue, 13 Aug 2024 03:33:05 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="75b586a96d8f13b1a18286173fed3ce1";
	logging-data="3733360"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX1+OnuQDNDSKc1pVLYFkJsBr"
User-Agent: Gnus/5.13 (Gnus v5.13)
Cancel-Lock: sha1:dPVrswZrLM4qnXPAZaKC5RmEst4=
	sha1:g5acPRgC3TND0ybHqLiaO9QdE4U=
Bytes: 5081

Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
> James Kuyper <jameskuyper@alumni.caltech.edu> writes:
>> On 7/10/24 17:23, Keith Thompson wrote:
>>> Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
>>>> Keith Thompson <Keith.S.Thompson+u@gmail.com> writes:
>>>>> Tim Rentsch <tr.17687@z991.linuxsc.com> writes:
>>>>> [...]
>>>>>> This posting has inspired me to try using (long)0.0
>>>>>> whenever a null pointer constant is needed.  As for
>>>>>> example
>>>>>>
>>>>>> (void*){ (long)0.0 }
>>>>>>
>>>>>> as an argument to a variadic function where a pointer
>>>>>> is expected.
>>>>>
>>>>> But surely ((void*)('/'/'/'-'/'/'/')) is more elegant.
>>>>
>>>> Surely not.  Furthermore the form I showed has a point,
>>>> whereas this example is roughly the equivalent of a
>>>> first grade knock-knock joke.
>>>
>>> I was of course joking.  I assumed you were as well.
>>>
>>> What is the point of (void*){ (long)0.0 }?  I don't believe it's
>>> a null pointer constant even in C23.
>>
>> I think you're right about that.
>
> The compound literal is not a null pointer constant.  I didn't
> say it is.  The null pointer constant is (long)0.0, like my
> earlier posting pointed out.
>
>> "An integer constant expression132) ... shall only have operands
>> that are ... compound literal constants of arithmetic type that
>> are the immediate operands of casts. ... Cast operators in an
>> integer constant expression shall only convert arithmetic types to
>> integer types, ...", so (long)0.0 is permitted."
>>
>> While (void*) looks like a cast, in this context it is a compound
>> literal of pointer type, which is not allowed.  [..]
>
> Don't be silly.  The compound literal works just fine in the
> context I mentioned for it:
>
>     #include <stdio.h>
>
>     int
>     main(){
>         printf( " null pointer : %p\n", (void*){ (long)0.0 } );
>         return  0;
>     }
>
> Compile it for yourself if you don't believe me.

You're right, a null pointer constant is not required in that context.
`(long)0.0` is null pointer constant.  `(void*){ (long)0.0 }` is not a
null pointer constant, but it is an expression whose value is a null
pointer of type void*.  (It is, for example, not valid as an initializer
for a pointer object with static storage duration.)

The question you're refusing to answer is: *what is the point*?  Why
would you want to use `(void*){ (long)0.0 }` in a context where a null
pointer is required, rather than the much clearer `(void*)NULL`, or
`(void*)0`, or any of several other possible expressions?

Yes, it's valid and is guaranteed to work properly, but why?

Again, my reference to `((void*)('/'/'/'-'/'/'/'))` was nothing more or
less than a joke.  It is a valid null pointer constant, written for the
sole purpose of deliberate obfuscation.  I found it amusing.  If you
don't, that's fine.  It is not something I would write in real code
unless my goal were either obfuscation, testing a compiler's handling of
odd code, or just demonstrating the range of weird expressions that can
be null pointer constants.

I initially assumed that you had written `(void*){ (long)0.0 }` with a
similar intent.  I'm still not sure you didn't.

I cannot force you to explain, and if you choose not to do so I will
simply cease caring about this.  But I continue to be annoyed by your
habit of telling us that something obscure has some significance and
refusing to explain, even when asked, what that sigificance is.

-- 
Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com
void Void(void) { Void(); } /* The recursive call of the void */