Değişken isimleri içinde yorum yazabilir miyiz?


145
int main()
{
     i/*nt*/a = 10;
     return 0;
}

Yukarıdaki koda sahipsem ve jetonları saymak istersem, bu 14 veya 13 jeton olur mu?

Bir değişken adı içerisinde yorum yazmak geçerli midir? Sen varsayabiliriz int i, int a, int iaküresel tanımlanır.


13
ANSI öncesi "geleneksel" C'de, en azından GNUcpp -traditional tarafından uygulandığı şekliyle, şu şekilde genişleyecektir ia = 10;.
Nate Eldredge

37
ne ilginç bir soru - neden daha önce hiç aklıma gelmedi?
StephenBoesch

177
@javadba: Çünkü mantıklı insanlar böyle bir şey yapmayı düşünmezler mi?
jamesqf

5
Bunu gerçekten yapmak istiyorsanız, Fortran'a geçebilirsiniz. Dizelerin dışındaki boşluklar ilk ayrıştırma aşamasında kaldırılır.
mpez0

3
Başlığı ".... değişken isimleri içinde ..." olarak düzenlemek üzereydim ama sonra gerçekten "arasında" demek istediğinizi anladım. (Bunu düzenlemek istedim çünkü orijinal başlığın cevabı "Neden, tabii ki!" Önemli olan kısım "boşluk yok".) "Bir yorum (beyaz alanı çevreleyen olmadan) C harfini ayırır mı?" asıl sorunuzu ifade eder mi?
Peter - Monica'yı eski durumuna getirin

Yanıtlar:


197

Yorumlar, program çevirisi 1'in 3. aşaması sırasında kaldırılır : her yorum bir boşluk karakteri ile değiştirilir. bu nedenle yorum /*nt*/kesinlikle bir simge değildir.

Hiçbiri ise int, main, i, aya da returnayrıştırma programı üretir, makro ön işleme olarak tanımlanan 14 belirteçleri (değil 13):

int main ( ) { i a = 10 ; return 0 ; }

İfadeli ibir tür olarak tanımlanmadığı sürece , C dilbilgisinde bir kuralla eşleşmeyen bir typedefsözdizimi hatası vardır i a.

Dolayısıyla değişken adlarının içine yorum yazamazsınız , yorum tanımlayıcıyı 2 ayrı simgeye böler. Bu, herhangi bir ön işleme ve C dili belirteci 2 için geçerlidir .

Bununla birlikte, tekli operatörler ile bunların işlenenleri arasında veya #önişleme yönergesi ve argümanları arasına yorum ekleyebileceğinizi unutmayın :

/**/#/**/include/**/<stdio.h>/**///////////////////////
/**/#/**/define/**/STAT/**/(/**/a/**/)/**/-/**/1/**////
/**/#/**/ifdef/**/STAT/**//////////////////////////////
/**/int/**/main/**/(/**/)/**/{/**//////////////////////
/**/int/**/a/**/=/**/+/**/1/**/;/**////////////////////
/**/printf/**/(/**/"Hello "/**/"world!\n"/**/)/**/;/**/
/**/return/**/STAT/**/;/**/////////////////////////////
/**/}/**///////////////////////////////////////////////
/**/#/**/endif/**//////////////////////////////////////

Ancak yukarıdaki makro tanımı, fonksiyon benzeri bir makroyu değil STAT, genişleyen normal bir makroyu tanımlar ( a ) - 1.

Diğer herhangi bir belirteç gibi değişken adları, kaçan yeni satırlarla bölünebilir. Kaçan yeni satırlar dizilerdir veya \hemen ardından yeni satır gelir. Bu diziler, program çevirisinin 2. aşaması sırasında kaynak kodundan çıkarılır. Ana amaçları, uzun makro tanımlarını birden çok satırda kırmaktır.

Aşağıda, aynı 14 jetonu üreten bir kod parçası 3 bulunmaktadır:

\
i\
nt\
 ma\
in()
{\
i/\
*nt\
*/a \
= 10;
r\
et\
urn\
 0;}

Kod renklendiricinin dilimlenmiş ve doğranmış anahtar kelimeleri ve yorumu nasıl kaçırdığına dikkat edin :)


1) Bu davranış ANSI-C aka C89'da belirtilmiştir. Bazı eski derleyiciler, belirteç yapıştırmaya neden olan ince bir şekilde farklı davranışlara sahipti, ancak bu tür özellikler yalnızca tarihsel açıdan önemlidir.

2) Bitişik dize sabitlerinin program çevirisinin 6. aşamasında birleştirilmesi gerçeğinden yararlanarak, bir dizi sabitinin içine neredeyse bir yorum ekleyebilirsiniz: printf("Hello "/* my name is Luca */"world!\n");

3) Bu Noel Ağacı sunum stili, gerçek programlarda kullanılmak üzere tasarlanmamıştır, C'nin girdi işleme yeteneklerinin nasıl kötüye kullanılacağını gösterir. Daha ayrıntılı numaralar Uluslararası Gizlenmiş C Kodu Yarışmasını kazandı


Sondaki boşlukların veya bunların eksikliğinin anlamsal olarak anlamlı olacağı ve bazı metin dosyası formatlarının olmayabileceği başka bir koşul olmadığı göz önüne alındığında, Standart'ın neden bir satır devamı ters eğik çizgi karakterinin yeni satırdan diğer boşluk karakterleriyle ayrılmamasını gerektirdiğini merak ediyorum. Boşluklarla biten satırları, olmayan satırlardan ayırt edebiliyor musunuz?
supercat

@supercat: Katılıyorum. Bu aynı zamanda bir içerdiğini kaçan yeni satır tanımaz Unix sistemleri üzerinde derleme hataları neden satır sonları olarak CR LF dizilerini kullanmak eski sistemlerden gelen dosyaların dava kapsayacak \rönce \n. Yine de bunun geri const char *path = "C:\\"; // the default path is C:\ 
tepeceği

Standart, metin dosyalarının bir satırın sonundaki boşluk karakterlerini destekleyebilmesini gerektirmez. Böyle bir yorum yazmak The path is "C:\", kodun anlamının son satırlara bağlı olmasından daha iyi görünebilir.
supercat

1
Teknik olarak, standart böyle bir zorunluluk getirmez, çünkü genellikle ihmal edilen çeviri aşaması 1'in , bu davranış belgelendiği sürece her satırdan takip eden boşlukları çıkarmasına izin verilir .
zwol

4
Bu cevap, aptalca soruların olmadığını kanıtlamak için uzun bir yol kat ediyor. Aferin.
Overbryd

65

Sözcüksel bir bakış açısından, bir yorum beyaz boşluk ile aynıdır.

C standardının sözcüksel unsurlarla ilgili 6.4p3 bölümü şunları belirtir:

... Ön işleme jetonları beyaz boşlukla ayrılabilir ; bu yorumlardan (daha sonra açıklanacaktır) veya beyaz boşluk karakterlerinden (boşluk, yatay sekme, yeni satır, dikey sekme ve form besleme) veya her ikisinden oluşur. ...

Daha spesifik olarak, bir yorum tek bir alana çevrilir. Bu, 5.1.1.2p3 bölümünde belirtilmiştir:

Kaynak dosya, ön işlem belirteçlerine ve beyaz boşluk karakter dizilerine (yorumlar dahil) ayrıştırılır. Bir kaynak dosya, kısmi bir ön işleme belirteciyle veya kısmi bir yorumla sona ermemelidir. Her yorum bir boşluk karakteri ile değiştirilir. Yeni satır karakterleri korunur. Yeni satır dışındaki her boş olmayan boşluk karakteri dizisinin korunup korunmayacağı veya bir boşluk karakteriyle değiştirilip değiştirilmeyeceği uygulama tanımlıdır.

Bunu açıklamak için, kodunuzu ön işlemciden geçirirseniz, şunları elde edersiniz:

  int main()
  {
       i a = 10;
       return 0;

  }

Bu nedenle boşluklar gibi yorumlar belirteçleri ayırmaya yarar.

Bu, kodun 13 değil 14 jeton içereceği anlamına gelir.


26

Sonuç, yazmışsınız gibi olacaktır:

i a = 10;

DEĞİL:

ia = 10;

12

Çeviriye bakın (diğer adıyla derleme) 3. Aşama , 2. adım: "Her yorum bir boşluk karakteri ile değiştirilir" .

Yani kavramsal olarak o noktada i/*nt*/aolur i a.


Yorumlar uzun tartışmalar için değildir; bu konuşma sohbete taşındı .
Machavity

1

sadece kod parçanızın ne biçimini kontrol edin

     int main()
    {
        int i/*nt*/a = 10;
        return 0;
    }

önişlemeden sonra olacaktır. Derleyicinize "-E" işaretini ekleyin, gcc -E myscript.c ve sonucu alacaksınız:

e.sharaborin@landau:~$ gcc -E myscript.c
# 1 "myscript.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "myscript.c"
int main()
{
    int i a = 10;
    return 0;
}

Ve tabii ki, bir hata olduğu sonucuna varabilirsiniz.


-9

Evet bunu yapabilirsiniz. Yorumlar derleyici tarafından atlanacaktır. Değişkeni etkilemeyecekler. Aynı olacak, sadece yorum etiketlerini sonlandırmayı unutmayın.


5
"değişkeni etkilemeyecek. Aynı olacak" Ne ile aynı, i aveya ia?
HolyBlackCat
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.