Soru veya geçerli değil C ++: bu kod neden derleniyor?


İşte QtCreator ile yaptığım çok basit bir C ++ uygulaması:

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;

    if (a < 1 or b > 3)
    {
       return 1;
    }
    return 0;
}

Bana göre, bu anahtar kelime olarak geçerli C ++ değil veya ayrılmış bir anahtar kelime değildir.

Ama eğer derler ve çalıştırırsam, herhangi bir uyarı olmaksızın iyi çalışır! Çıkış kodu 0 ve b = 4 değiştirirseniz, çıkış kodu 1'dir!

Gizli bir tanım olmadığından emin olmak için hiçbir şey eklemiyorum.

Bu benim için gerçekten garip. Bu Qt'nin tanımladığı bir şey mi? Bununla ilgili belgelerinde hiçbir şey bulamadım.


24
2017-09-16 14:31


Menşei


Crazyness! İyi benekli +1 - Justicle
Ne iyi tespit edildi? veya olduğu C ++ 'da bir anahtar kelime. - Michael Foukarakis
@MichaelFoukarakis bence well spotted anlamına gelir why does this code compile? sorunun bir kısmı: Bazı derleyiciler #include <iso646.h> ve bazıları değil. Çoğu (tümü olmasa da) IDE bu yeni "anahtar kelimeleri" vurgulamaz. - Wolf


Cevaplar:


Göre Vikipedi:

C ++, takma ad olarak hareket etmek için anahtar kelimeleri tanımlar   işlev gösteren bir dizi sembol için   operatörler olarak: ve (&&), bitand (&),   and_eq (& =), veya (||), bitor (|) veya_eq   (| =), xor (^), xor_eq (^ =), değil (!),   not_eq (! =), compl (~).

Gibi MadKeithV dikkat çekiyorBu değiştirmeler C'nin iso646.h'sinden geldi ve ISO C ++ 'ye operatör anahtar sözcükleri olarak dahil edildi. İso646.h için Wikipedia makalesinde, bu anahtar kelimelerin nedeninin, uluslararası ve diğer QWERTY olmayan klavyeler için sembollere kolay erişilememiş olabileceği belirtiliyor.


54
2017-09-16 14:33



Cool - 90'lı yılların başından beri C ++ yazıyordum ve bunun hakkında hiçbir fikrim yoktu. Hiç olma ihtimali yok kullanım o, ama bilmek güzel. - Graeme Perrow
Bakana kadar ben de bilmiyordum. Kullanmak garip görünüyor ve eminim C ++ yazan ve bu konuda bilmeyen birçok insan var. - Thomas Owens
Bunların, diğer tüm sembol tuşlarına (&, |, vb.) Sahip olmayan İngilizce dışındaki klavyeli insanlara yardımcı olması için eklendiğine inanıyorum. - KeithB
+1. Bazıları IRC'de bunu bir gün yaptı: struct y { compl y(); }; :) - Johannes Schaub - litb
Yakın zamanda, bazı yerlerde, özellikle de birim testlerinde <ciso646> (bir C ++ programında iso646.h içermenin doğru yolu) kullanmaya başladım. Örneğin: if (!someCondition) bana göre daha iyi görünüyor if (not someCondition) bazen bir bakışta beri! Parenslerin yanında kaybolur. - Patrick Johnmeyer


or C ++ anahtar kelimesidir ve bunun yerine kullanmanıza izin verilmiştir ||. Büyü yok.

Aynısı - için de geçerli and ve diğer birçok mantıksal işleç. Genel olarak bilinen isimlere bağlı kalmak, bunun gibi karışıklıklardan kaçınmak genellikle en iyisidir. Eğer kullanırsan orbirisi merak edecek "neden bu derleme";)


16
2017-09-16 14:35



Eski cevap, biliyorum, ama sadece anahtar kelimeler değil, alternatif belirteçleri olan serin ve akılcı olmak istiyorum. Çocuk, seçici ve can sıkıcı olmak konusunda kendimi iyi hissediyorum. </ Istihza> - GManNickG
Ah, bu farkı farketmedim. Ama evet, haklısın gibi görünüyor. :) - jalf
@GManNickG: Bunlar anahtar kelimelerdir (en azından mevcut çalışma taslağında): Bölüm C.5.2.3: "Simgeler ve, and_eq, bitand, bitor, compl, not_eq, not veya or_eq, xor ve xor_eq anahtar kelimelerdir Bu Uluslararası Standartta (2.11). <ciso646> 'da tanımlanan makro adları olarak görünmezler. - Hannes


iso646.h Bir dizi operatör alternatifini tanımlar - bu, C ++ standardının bir parçasıdır.


7
2017-09-16 14:38



<iso646.h> C ++ 'da boş. - avakar
Visual Studio 2003'ten 2010'a kadar değil (msdn.microsoft.com/en-us/library/bw6140c5%28VS.80%29.aspx) - Joris Timmermans
Yeniden ifade edeyim: C ++ derleyicisi söz konusu olduğunda dosya boş. Kaynakları kontrol edin, makroların koşullu olduğunu göreceksiniz. __cplusplus makro tanımlanmıyor. - avakar
_MSC_EXTENSIONS tanımlanmadığı sürece - Joris Timmermans
MSVC, 1989 C standardından beri pek çok şey eklemiyor. <iso646.h>, çeşitli geniş-karakterli başlıklar ve benzerleri ile birlikte 1994 değişikliklerinin bir parçası olarak eklenmiştir. - Jonathan Leffler