Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 27 odgovora
  • 8.676 pregleda

Najnovija ↓

Da li NULL uvek mora biti 0 ? 12.05.2004. u 12:17 · pre 273 meseca #1
Evo jednog zanimljivog pitanja !!!

Da li NULL mora uvek biti na adresi 0 u memoriskom prostoru ?
Da li je uvek tako u svim uredjajima, svim sistemima, svim programskim jezicima ?
Potpis
Fight with the best, fall like a rest.
Re: Da li NULL uvek mora biti 0 ? 12.05.2004. u 14:08 · pre 273 meseca #2
NULL nije nula vec je vrednost izraza za praznu varijablu. Znaci nije ni 0 ni '' vec samo null (nil u C-u).
Re: Da li NULL uvek mora biti 0 ? 17.05.2004. u 16:23 · pre 273 meseca #4


ISO-IEC 9899--1999 (E)
7.17/3
The macros are NULL which expands to an implementation-defined null pointer constant;


ISO-IEC-14882--1998
4.10/1
A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero;

Potpis
X
Re: Da li NULL uvek mora biti 0 ? 18.05.2004. u 03:37 · pre 273 meseca #5
NULL uglavnom ima vrednost 0.Mada po standardu C-a to nije obavezno pravilo pa se moze reci da zavisi od kompajlera.
U svakom slucaju poredjenje poentera sa nulom nije preporucljivo (radi ali i nemora uvek) Vec jednostavno poredi sa NULL i ne razbijaj glavu sta je razvojni tim kompajlera utripovao.
Re: Da li NULL uvek mora biti 0 ? 18.05.2004. u 03:52 · pre 273 meseca #6
Citat:
***ArChAnGeL***:
NULL uglavnom ima vrednost 0.Mada po standardu C-a to nije obavezno pravilo pa se moze reci da zavisi od kompajlera.

Po standardu C-a to je obavezno pravilo! Ako kompajler prati standarde svuda mozes da pises 0 umesto NULL ako hoces.

http://www.eskimo.com/~scs/C-faq/q5.10.html

Citat:

No. (Using NULL may be preferable, but not for this reason.) Although symbolic constants are often used in place of numbers because the numbers might change, this is not the reason that NULL is used in place of 0. Once again, the language guarantees that source-code 0's (in pointer contexts) generate null pointers. NULL is used only as a stylistic convention.
Re: Da li NULL uvek mora biti 0 ? 18.05.2004. u 13:43 · pre 273 meseca #7
Citat:

Po standardu C-a to je obavezno pravilo! Ako kompajler prati standarde svuda mozes da pises 0 umesto NULL ako hoces.


Netacno.
Citiraj standard kao sto sam ja.

Citat:

No. (Using NULL may be preferable, ...

Ne pise nigde u STANDARD-u.
Takav faq mogu i ja da napisem.

ALI...

Standard za C ( ISO-IEC-9899--1999 ) je jasan:

Citat:

ISO-IEC 9899--1999 (E)
7.17/3
The macros are NULL which expands to an implementation-defined null pointer constant;



Za C++ takodje:
Citat:

ISO-IEC-14882--1998
4.10/1
A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero;





Potpis
X
Re: Da li NULL uvek mora biti 0 ? 18.05.2004. u 21:29 · pre 273 meseca #8
Citat:
e pise nigde u STANDARD-u.

Kako ne pise?

Citat:
Takav faq mogu i ja da napisem.

Faq je odlican. Verovatno najpoznatiji c faq. Ne znam sto si ovo rekao.

Citat:
A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero;


Pa zar nisam ja to rekao? Uvek mozes null konstantu da zamenis sa 0 jer je to isto.

Da nije tako onda ovi izrazi ne bi bili legalni:
if(p){}
if(p==0) {}

Citat:
iso9899:
6.3.2.3 Pointers
An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.


Znaci moze i integer konstanta nula, ne mora da bude kastovano. Da mora, oni izrazi sto sam naveo ne bi bili u redu. Po standardu pointer uvek mozes da poredis sa nulom.

Takodje,
Citat:
ansi_iso_iec_14882_1998
73. strana, odeljak 5.2.10 na dnu pise
"converting an integral constant expression with value zero always yield a null pointer, but converting other expressions that happen to have value zero not yield a null pointer."
Re: Da li NULL uvek mora biti 0 ? 19.05.2004. u 15:19 · pre 273 meseca #9
Standard kaze da NULL ne mora da bude adresa nula,
ali pri konverziji u int dobijas nulu.

To sto vecina kompajlera forsira da je NULL nulta adresa je
da bi konverzija bila brza.

Na nekim sistemima int i pointer se "tretiraju" kao jedno te isto.

Kad poredis pointer i nulu, nulu kompajler posmatra kao int.
Pa imas konverzije iz nule( tip int) u NULL( tip pointer) da bi poredjenje moglo da bude izvrseno.

itd.
Potpis
X
Re: Da li NULL uvek mora biti 0 ? 20.05.2004. u 15:24 · pre 273 meseca #10
Citat:
Standard kaze da NULL ne mora da bude adresa nula,
ali pri konverziji u int dobijas nulu.

Netacno, standard kaze da je NULL integralna konstanta sa vrednoscu nula. Pa ti si sam to citirao:

Citat:
A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero


Citat:
Kad poredis pointer i nulu, nulu kompajler posmatra kao int.

Netacno. Nulu kompajler predstavlja kao null pointer pri poredjenju sa pointerom. Recimo ne mozes promenjivu tipa int koju ima vrednost nula da poredis sa pointerom i da tako gledas da li je to null pointer. To nije portabilno i nije po standardu. To i pise jednom od gornjih citata.
Re: Da li NULL uvek mora biti 0 ? 21.05.2004. u 12:38 · pre 273 meseca #11
srki objasni ovo:
Citat:

ISO-IEC 9899--1999 (E)
7.17/3
The macros are NULL which expands to an implementation-defined null pointer constant;


Citiram tebe:
Citat:


iso9899:
6.3.2.3 Pointers
An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.




Znaci ovo je legalno:


Code:

void *p;
const int a=10, b=10;
// ...
// ...

if( p !=( a-b ) ) {/*...*/}
if( p !=(int)0 ) {/*...*/}
if( p !=(24-24) ) {/*...*/}

Potpis
X
Re: Da li NULL uvek mora biti 0 ? 21.05.2004. u 15:00 · pre 273 meseca #12
Ono prvo nije legalno ali drugo i trece jeste legalno.
Zasto ono prvo nije?
Zato sto kompajler ne zna da li je a-b jednako nuli. To ti se vidi u toku izvrsavanja programa. Tu ono const samo znaci da promenjive a i b ne smes da menjas ali kompajler ne posmatra njihove vrednosti i ne zna koje su njihove vrednosti prilikom racunanja izraza a-b. To ti program izracuna u toku rada. Da si stavio #define onda bi radilo.

U izrazu "An integer constant expression with the value 0" ono integer constant expression se odnosi na izraz koji je konstanta prilikom kompajliranja. Recimo (2*3-1-1-2*2)

Fora je sto ce i prvi slucaj da ti radi na windowsu jer null pointer ima vrednost nula ali ti nece raditi na nekim masinama gde null pointer nema vrednost nula.

Citat:
srki objasni ovo:
ISO-IEC 9899--1999 (E)
7.17/3
The macros are NULL which expands to an implementation-defined null pointer constant;


Da, ali je standardom definisano i null pointer constant (to si ti prvi put citirao)
4.10 A null pointer constant is an integral constant expression rvalue of integer type that evaluates to zero.

Znaci 0, 2-2, 5*5-25 itd....

Onaj faq je zaista super. Ja znam da sam ga jos odavno procitao celog makar dvaput.
Re: Da li NULL uvek mora biti 0 ? 21.05.2004. u 17:47 · pre 273 meseca #13
Ja ne razumem zasto tolike polemike. NULL ili NiL nije isto kao i vrednost 0.

A value that means, "a value is not applicable" or "the value is unknown". Nulls are not equal to any specific value, even to each other.
Re: Da li NULL uvek mora biti 0 ? 22.05.2004. u 08:47 · pre 273 meseca #14
NULL jeste isto sto i 0. Svuda gde ti pise NULL mozes da zamenis sa 0.
Re: Da li NULL uvek mora biti 0 ? 22.05.2004. u 19:56 · pre 273 meseca #15
Pa cekaj jeste malo konfuzno pogotovu kada programirate ali opet ponavljam

A value that means, "a value is not applicable" or "the value is unknown". Nulls are not equal to any specific value, even to each other.
Re: Da li NULL uvek mora biti 0 ? 23.05.2004. u 16:06 · pre 273 meseca #16
U toj recenici se pod Null-om podrazumeva Null pointer a ne NULL konstanta. NULL konstanta je isto sto i nula (#define NULL 0) a kada recimo stavis p=0 kompajler kada vidi sa desne strane nulu onda ce p da postavi da bude null pointer cija vrednost zavisi od operativnog sistema i procesora. Moze cak biti i vise vrednosti null pointera. Tebe to ne treba da interesuje. Obicno je vrednost null pointera nula ali ne mora da znaci! Ali koja god da je vrednost ti kada uradis p=0 ili p=NULL kompajler ce da postavi p na pravu vrednost.

Malo jasnije?
Re: Da li NULL uvek mora biti 0 ? 31.05.2004. u 11:59 · pre 272 meseca #18
srki:
Citat:
Obicno je vrednost null pointera nula ali ne mora da znaci! Ali koja god da je vrednost ti kada uradis p=0 ili p=NULL kompajler ce da postavi p na pravu vrednost.


Pa ovo pricam i ponavljam.

Potpis
X
Re: Da li NULL uvek mora biti 0 ? 31.05.2004. u 12:12 · pre 272 meseca #19
U praksi NULL je 0, cisto sumnjam da postoji i jedan kompajler (koji se koristi :)) gde to nije tako. Ako nista drugo, gomila koda koja implicitno ili cak eksplicitno ocekuje da je NULL 0 ne bi radila.
Re: Da li NULL uvek mora biti 0 ? 31.05.2004. u 13:32 · pre 272 meseca #20
jos jednom grep resava velike misterije covecanstva:

1) GCC
#undef NULL
#if defined (__cplusplus)
#define NULL 0
#else
#define NULL ((void *) 0)
#endif

2) MS VCPP VS2003
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

3) Intel CPP
#ifndef NULL
#define NULL _NULL
#endif
.....
#define _NULL 0
Potpis
OV SM
LA PK
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme