SORU
21 AĞUSTOS 2015, Cuma


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
21 AĞUSTOS 2015, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hanksranger

    hanksranger

    6 EKİM 2009
  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008