Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #387536

Re: question about nullptr

From Keith Thompson <Keith.S.Thompson+u@gmail.com>
Newsgroups comp.lang.c
Subject Re: question about nullptr
Date 2024-08-12 18:44 -0700
Organization None to speak of
Message-ID <87ikw5gpsn.fsf@nosuchdomain.example.com> (permalink)
References (10 earlier) <86le2b9ru6.fsf@linuxsc.com> <8734ojxlg7.fsf@nosuchdomain.example.com> <86msmp8fld.fsf@linuxsc.com> <87cynluekl.fsf@nosuchdomain.example.com> <86plqdz0q3.fsf@linuxsc.com>

Show all headers | View raw


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:
>>> 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.
>
> The null pointer constant is (long)0.0, which it must be for the
> compound literal to work.

Depending on the context, a null pointer constant is not necessary for
the compound literal to work.  Adapting your example from elsethread :

#include <stdio.h>
int main(void) {
    void *np = (long)0.0;
    printf(" null pointer : %p\n", (void*){ np });
}

>                            Besides making it obvious that (long)0.0
> is a null pointer constant, the compound literal is safer than
> using just a cast.

I fail to see how it's safer.

>> My example is.
>
> Your example actually has two null pointer constants:

It actually has four, but how is that relevant?

I wrote :

    But surely ((void*)('/'/'/'-'/'/'/')) is more elegant.

The following are all null pointer constants :

    '/'/'/'-'/'/'/'
    ('/'/'/'-'/'/'/')
    (void*)('/'/'/'-'/'/'/')
    ((void*)('/'/'/'-'/'/'/'))

But I never said otherwise.  I merely said that my example (the
outermost expression) is an NPC.

>                                                        the
> expression being casted, and the full expression casting a null
> pointer constant to (void*).  But in neither case is that especially
> obvious.  Also the expression you wrote is less safe.  For example,
> if it had been written ((void*)('/'/'/'+'/'/'/')), the result would
> still be legal C, and compile without problem, but would very likely
> not be what was desired.  By contrast, if the compound literal had
> been written (void*){ (long)1.0 }, it simply would not give a clean
> compile, indicating that something is likely askew.

One more time: It was a joke.  I thought that was obvious when I wrote
it.  If it wasn't, you know now.

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

Back to comp.lang.c | Previous | NextPrevious in thread | Find similar


Thread

Re: question about nullptr Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-08-12 18:10 -0700
  Re: question about nullptr Keith Thompson <Keith.S.Thompson+u@gmail.com> - 2024-08-12 18:44 -0700

csiph-web