Nasıl düzgün bir null işaretçi tüm bitleri sıfır ise C/C kodu yazmak
comp.lang.c FAQ dediği gibi, boş gösterici tüm bitleri sıfır mimarileri vardır. Yani soru aslında şu inşaat kontrolleri nedir:
void* p = get_some_pointer();
if (!p)
return;
Makine bağımlı null işaretçi ile p
karşılaştırarak veya aritmetik sıfır p
karşılaştırıyorum mıyım?
Yazayım
void* p = get_some_pointer();
if (NULL == p)
return;
bu tür mimarileri için hazır olmak için ya da sadece benim paranoya yerine?
CEVAP
C spec göre
Bir tamsayı değeri 0 ile sabit ifade, ya da bu tür bir ifade void atama *, bir null işaretçi denir sürekli. Bir null 55) işaretçi işaretçi türü, elde edilen dönüştürülür işaretçi, boş bir işaretçi olarak adlandırılan, eşit olmayan bir karşılaştırma garantilidir herhangi bir nesne veya işlev işaretçisi.
0
bir null işaretçi. Ve eğer işaretçi türüne dönüştürmek eğer bazı yapılar için non-all-bit-sıfır olabilecek bir null işaretçi alacağız. Sırada spec işaretçiler ve işaretçi sabit: null karşılaştırma hakkında ne diyor bakalım
Eğer bir işlenen bir ise işaretçi ve diğer boş gösterici değilse, null işaretçi sabit işaretçi türü dönüştürülür.
Hadi (p == 0)
düşünün: ilk 0
boş gösterici dönüştürülür, ve sonra p
mimarlık bağımlı. olan boş bir işaretçi ile karşılaştırıldığında
Sonraki, spec olumsuzluk operatörü hakkında ne diyor bakın:
Mantıksal olumsuzluk operatörü sonucu ! onun değeri ise 0'dır işlenen gelirse ifadenin değerini karşılaştırır eşitsiz 0, 1 karşılaştırır 0'a eşit. Sonuç int. İfade !E eşdeğerdir (0==E).
Bu (!p)
(p == 0)
eşdeğer, spec göre, makineye tanımlanan null işaretçi sürekli karşı p
test anlamına gelir.
Böylece, güvenli bir şekilde bile boş işaretçi-bit-tüm sıfır olmayan mimarileri if (!p)
yazabilirsiniz.
C , null gösterici sabiti olarak tanımlanır:
Null gösterici sabiti integral sabiti ifadesi (5.19). sıfır değerlendiren tamsayı türü prvalue veya tür bir prvalue ::nullptr_t std. Null bir işaretçi bir işaretçi dönüştürülebilir yazın; sonuç bu tür bir null işaretçi değeri ve nesne işaretçisi her değeri ayırt edilebilir veya fonksiyon işaretçi türü.
C artı nullptr
sözdizimi şeker var ne yakın. Operatör davranışları ==
ile tanımlanır:
Buna ek olarak, üyeleri için işaretçiler, ya da bir işaretçi karşılaştırılabilir üye ve boş bir işaretçi. Üye dönüşümleri için işaretçi (4.11) ve yeterlilik dönüşüm (4.4) onları getirmek için yapılmaktadır yaygın bir tür. Eğer bir işlenen boş bir işaretçi sağlar. ortak tür diğer işlenen türüdür. Aksi takdirde, ortak yazın birinin tipine benzer (4.4) üye için bir işaretçi. işlenen, bu cv yeterlilik imza (4.4) ile işlenen türleri cv-yeterlilik imzaları Birliği. [ Not: bu üye herhangi bir işaretçi null karşılaştırılabilir anlamına gelir işaretçi. — son not ]
0
işaretçi türü (C) dönüşüm yol açar. Yadsınması için operatör:
Mantıksal olumsuzluk operatörü işlenen ! içerik bakımından. bool (Madde 4) dönüştürülür; değeri dönüştürülmüş ise geçerlidir yani doğru ve yanlış aksi durumda. Sonuç türü bool.
!p
sonucu bool
işaretçi dönüşüm yapılır nasıl bağlıdır anlamına gelir. Standart diyor ki:
Değer null işaretçi değeri veya null üye işaretçi değeri sıfır. yanlış dönüştürülür;
if (p==NULL)
if (!p)
C de aynı şeyleri yapar.
Neden adresi null işaretçi için kullan...
Null karma kodu her zaman sıfır olmalı...
Statik üye fonksiyonları; Nasıl düzgün...
Kapatmak için nasıl <ımg> düzgün...
Nasıl ASP.NET Durum Kodu 500 göndermek...