C'de &&& işlemi nedir


195
#include <stdio.h>

volatile int i;

int main()
{
    int c;

    for (i = 0; i < 3; i++) 
    {
         c = i &&& i;
         printf("%d\n", c);
    }

    return 0;
}

Kullanarak derlenmiş yukarıdaki program çıktısı gccolan

0
1
1

İle -Wallya da -Waddressseçenek, gccbir uyarı verir:

warning: the address of i will always evaluate as true [-Waddress]

cYukarıdaki programda nasıl değerlendiriliyor?


42
İnanıyorum ki i && (&i)? İlginç bir SO yinelenen bir yazı bulamıyorum.
irrelephant

42
while (i &&& i <-- j) {}.
kennytm


8
Yinelenen değil, benzer bir soru ve bu iyi bir bağlantı
Nathan Cooper

Yanıtlar:


272

Bu c = i && (&i);, ikinci bölüm gereksiz olduğu için &iasla değerlendirmeyecektir false.

Aslında tekli aşırı yükleyebileceğiniz kullanıcı tanımlı bir tür operator &için farklı olabilir, ancak yine de çok kötü bir fikirdir .

Eğer varsa uyarıları açmak , gibi bir şey alırsınız:

uyarı: 'i' adresi her zaman 'gerçek' olarak değerlendirilir


1
Neden olmasın c = i & (&&i);:; iEtiket nerede ?
anishsane

4
@anishsane iolarak tanımlanır intve soruda etiket yoktur. Ayrıca, maksimal munch ...
Luchian Grigore

5
@anishsane: Ve &&bir etiketin adresini alan operatör yine de standart olmayan gcc uzantısıdır. Ancak standart olsa bile, maksimum munch kuralı, bu şekilde ayrıştırılmasını önler (boşluk eklemezseniz).
Keith Thompson

Aslında, &ideğerlendirebilir false. Bazen varsayılanlar için kullanılır. Örnek: void fn(type& x = *reinterpret_cast<type*>(NULL)); değeri nedir &xiçinde fneğer fnparametreler olmadan denir? 0 aka yanlış. Bununla birlikte, tarif edilen şekilde kullanmak i == 0, eğer tanımladığım gibi kullanmazsa, her zaman doğru olacaktır c = &i && i.
Adrian

@LuchianGrigore: nasıl yani?
Adrian

118

&&&C'de operatör veya simge yok . Ancak &&(mantıksal "ve") ve& (tekli adres veya bitsel "ve") operatörleri mevcuttur.

By maksimal Munch kural şudur:

c = i &&& i;

buna eşdeğerdir:

c = i && & i;

Her cikisi de ive&i doğruysa 1, ikisinden biri yanlışsa 0 olarak .

Bir int için, sıfır olmayan herhangi bir değer doğrudur. İşaretçi için null olmayan herhangi bir değer true'dur (ve bir nesnenin adresi her zaman null değildir). Yani:

Bu ayarlar ceğer 1'e ikadar sıfır olmayan, ya da 0eğeri sıfıra eşit.

Bu, &&&burada sadece kasıtlı gizleme için kullanıldığı anlamına gelir . Ödev aşağıdakilerden herhangi biri olabilir:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.