2013-09-01 15 views
5

i+++j printf ifadesinde, her zaman i++ +j olarak mı değerlendiriliyor?i +++ j, her zaman i ++ + j olarak değerlendiriliyor mu?

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main() { 
    int i =5,j= 6, z; 
    z=i^j; 
    printf("%d",i+++j); 
    return 0; 
} 
+2

Evet, Postfix artış/azaltma yüksek önceliğe sahiptir. –

+0

Çok fazla kopyalar var, ancak +++ olarak adlandırılması zor bir arama terimi gibi görünmüyor. –

+5

@ShashankKadne: Operatör önceliği ile ilgisi yok. –

cevap

18

i+++ji++ + j eşdeğerdir.

Bu, operatörün önceliği ile ilgisi yoktur. İfadeler ayrıştırılmadan önce +++, derleyici tarafından ++ + olarak çözülür.

C standardı, her biri bir öncekinin çıkışını kullanarak çeviri fazı dizisini tanımlar. +++, 3. aşamada ++ + olarak çözülür, bu da kaynağı önişlemci jetonlarına ayrıştırır. Operatör önceliği faz 7, sözdizimsel ve semantik analize kadar dikkate alınmaz. (Çeviri fazlar ayrı evrede olarak uygulanması gerekir ya geçer, fakat derleyici oldukları gibi davranır gerekir yoktur.)

+++++ + karar olup + ++ gayri adlandırılan şeydir diyor kurallar " maksimal munch kuralı ". Bu bölüm, 6.4 paragraf 4 de belirtildiği: giriş akımı bir verilen karaktere kadar belirteçleri ön işleme ayrıştırıldı edilmiştir

, bir sonraki ön işleme belirteci bir ön işleme belirteci teşkil edebilir karakter uzun dizi olup.

(Eğlenceli, endeks için "maksimal munch" anlamına gelir, ama bu terim standardında başka bir yerde söz edilmez.)

Bu aynı zamanda olarak simgeleþtirilmiþ edilebileceğini i+++++j, ima geçerli ifade i++ + ++j, aslında bir sözdizimi hatası olan i ++ ++ + j. i++ + j: Elbette

çözümü, bir programcı için, net dizgeciklerine bölünme yapmak için boşluk eklemektir. (i+++j derleyici çok açıktır, ama i++ + j bir insan okuyucuya çok daha nettir.)

Referans: N1570, bölüm 6.4, paragraf 4. N1570 2011, ISO C standardının bir taslağıdır. Bu kural, standartın önceki sürümlerinden değiştirilmemiştir. Çeviri aşamaları tartışılmıştır

+0

+1 (daha önce hiç yeni olmadı). – haccks

1

Evet. (i++) + (j) olarak ayrıştırılacaktır. sonek arttırma/azaltma operatör ilaveli operatörü üzerinde yüksek önceliğe sahip olduğu

+3

"Evet" kafa karıştırıcı. –

+0

@R ..; Neden sana kafa karıştırıyor? – haccks

+4

@R ..: Asıl başlık "Bu çıktı derleyiciye mi bağlı?"; Sorunun gövdesindeki ilk cümle “... her zaman i ++ + j” olarak kabul edilir? Cevaplar sırasıyla "hayır" ve "evet" dir. Başlığı yeni düzenledim, tesadüfen her ikisine de doğru cevabı "evet" yaptık. –

-2

, herhangi bir (i ++) olarak ele alınır şüphe + j vardır. Yani, bir derleyici sorunu değil, operatör öncelik tablosunu düşünmelisiniz.

Ayrıca, ifadeler arasında uygun boşluk koymak sizi öneririm, bu daha sonra kodunuzda geçmesi durumunda yararlı olacaktır. :)

Bu yardımcı olur umarım!

+0

Derleyici değilse, o zaman ifadeleri ayrıştırmadan kim sorumludur? – haccks

+1

"derleyici buna bağlı olmaz" - olacak. 'i ++ + j' ve' + ++ j' farklı şekilde ayrıştırılır. –

+0

@haccks evet derleyici sorumludur ve konulara bağlı olarak cevaplarımın içeriğine bağlı olacaktır. Ve bunu netlik amacıyla düzenledim. – Ashima

İlgili konular