2016-04-13 19 views
0

Bu kodun neden 0 yerine 2'yi yazdırdığını sormak istiyorum. #define "değerleri" makroların adlarına "atama" ve sonucu da hesaplar mı? Bu cevabı nasıl veriyor?#define makrolarını basit bir cout ifadesinde kullanma

#include <iostream> 
using namespace std; 

#define A 0 
#define B A+1 
#define C 1-B 

int main() { 
    cout << C<<endl; 
    return 0; 
} 
+0

C -> "1-B" -> "1-A + 1" -> "1-0 + 1" = 2 –

+0

1 gibi gitmez - (0 + 1) – kyrpav

+1

Parantezleri makrolara eklemeniz gerekir. –

cevap

3

Makrolar

#define C 1-B 

demektir

1-A+1 

olur ve ardından A biz daha sonra 0 istiyorsanız 2'dir

1-0+1 

zorunda genişletilmiş alır Yani direkt metin yerine vardır makroları kullanmayı bırakın ve bunun yerine sabit değişkenleri kullanın

const int A = 0; 
const int B = A + 1; 
const int C = 1 - B; 

Ve şimdi C 0.

+2

Ayrıca, öncelikli hale getirmek için makro parantez içinde parantez de kullanılabilir. – lisyarus

+0

@lisyarus True. Ben büyük #defines sahip değilim ve böyle bir durumda onlar yerine bir const değişkeni kullanacağım. – NathanOliver

+0

Genelde teşekkür ederim ki, makrolarda hesaplama yapmaktan kaçınıyorum, ama ben çalıyordum ve bir şeyleri özlediğimi buldum. – kyrpav

2

önişlemci 2 eşittir 1-0+1 genişler 1-A+1 genişler 1-B için C makro, genişler. Sıralı atama açısından düşünmeyin, ancak makro tanımları etrafında parantez ekleyerek istenen davranışı alabilirsiniz. Sonra C makrosu, (1-B)'a, sonra (1-(A+1))'a ve 'a eşittir, bu da 0'a eşittir.

Düzenleme: Örnek olarak

, FOO17 eşit olduğunda BARFOO "atandığı" olsa bile baskılar 42 aşağıdaki kod kesik. Bunun nedeni, genişlemenin gerçekte kullanılıncaya kadar ertelenmesidir. cout satırında, BAR hala FOO'a eşittir, ancak bu noktada FOO şimdi 17 değil 42 şeklindedir. İçinde ilk #undef bulunmadan bir makroyu yeniden tanımlamanın kötü bir uygulama olduğunu unutmayın.

#define FOO 17 
#define BAR FOO 
#define FOO 42 
cout << BAR << endl; 
+0

A, B sonra C'yi hesapladığını düşündüm. – kyrpav

+0

@kyrpav Önişlemci * hiçbir şeyi * hesaplamıyor. Daha ziyade makro adını ve ilgili genişlemesini kaydeder. Sadece çalışma zamanında (veya muhtemelen bu durumda derleme zamanı) aritmetik gerçekleştirilir. Umarım bunu daha açık hale getirmek için cevabı güncelledim. – MooseBoys

0

C basitçe metni değiştirmek tanımlar ve operatör önceliği veya hesaplama kurallarına umurumda değil 1-0+1

Preprocessor genişler çünkü.

İlgili konular