[OT]C CO tim chtel basnik rici?

Jan Waclawek konfera na efton.sk
Středa Prosinec 31 10:24:52 CET 2014


>> NULL je ve vět±inou (ne-li vµdy) definován jako 0 nebo (void*)0 takµe
>> vět±ina programátorů bere NULL a 0 jako synonymum
>
>to jako kde jste k tomuhle prisel? obecne to rozhodne neplati - pak je 
>jaksi zbytecne mit 0 a null
>


To si mylis so stavom zo skutocnych programovacich jazykov, pravdepodobne z
Pascalu. Tam ano, nil je specialna konstanta netypovaneho smernika
(pointer) u ktoreho je zarucene, ze sa nerovna ziadnemu inemu smerniku; to
je vsetko (ISO/IEC 7185:1990 6.4.4). Vobec, u skutocnych programovacich
jazykov je zbytocne spekulovat o *hodnote* smernika, to je interna
zalezitost prekladaca a programatora do toho nic nie je.

C naproti tomu vznikol ad-hoc bastlenim, a bol len dodatocne kodifikovany,
takze hodnoty pointrov su tradicne pokladane priamo za adresy ukazovanych
objektov; dalej 0 a NULL su v C tradicne ekvivalentne (pozor, NULL nie
null, lebo C je case sensitive). Tipujem, ze u PDP-11 je na adrese 0
nejaky reset vektor alebo nieco podobne, na ktore nikdy nenastane problem
ukazovat, takze to bolo pre Thomsona a Ritchieho dost dobre ako unikatny
pointer co sa nerovna ziadnemu inemu; no a uz to tak zostalo, bez ohladu
na problemy ktore to prinasa. Neskorsie "normovanie" z toho potom robi
takuto splet:


C99, 6.3.2.3#3
An integer constant expression with the value 0, or such an expression cast
to type
void *, is called a null pointer constant.(55)

(55)  The macro NULL is defined in <stddef.h> (and other headers) as a null
pointer constant; see 7.17.

If a null pointer constant is converted to a
pointer type, the resulting pointer, called a null pointer, is guaranteed
to compare unequal
to a pointer to any object or function.

#4
Conversion of a null pointer to another pointer type yields a null pointer
of that type.
Any two null pointers shall compare equal.


To pouzitie v if () je komplikovanejsie: C99, 6.8.4.1#2:
In both forms [if() aj if()else], the first substatement is executed if the
expression compares unequal to 0.

pre "compares unequal" musime siahnut po 6.5.9 Equality operators:
#5
Otherwise, at least one operand is a pointer. If one operand is a pointer
and the other is a
null pointer constant, the null pointer constant is converted to the type
of the pointer.


Takze ta 0 pre implicitne porovnanie z 6.8.4.1#2 je podla prvej casti prvej
vety z 6.3.2.3#3 "null pointer constant", ktora je potom podla 6.5.9#5
implicitne pretypovana na pointer takeho typu ako je "operand" v tom if(),
tym z implicitnej nuly podla 6.3.2.3#4 vznikne null pointer, pre ktory je
podla druhej vety z 6.3.2.3#3 zarucene, ze sa nerovna ziadnemu skutocnemu
pointru; sucasne podla 6.3.2.3#4 je zarucene, ze sa bude rovnat
akemukolvek nulovemu pointru, ktorym je aj makro NULL podla footnotu
(55)...

wek









Daląí informace o konferenci Hw-list