Bir dizinin uzunluğunu sabit kullanarak tanımlayabilirim, bu yüzden neden int d [b] çalışmıyor?


11
int a = 5;
const int b = a, c = 4;

int e[a];
int d[b];
int f[c];

'İn tanımı f[c]geçerlidir.
Değişken bde bir sabittir int, ancak derleyici satır için "ifade sabit bir değere sahip olmalıdır" hatasını verdi int d[b]. Arasındaki farklar nelerdir bve c?

Yanıtlar:


16

b ve c arasındaki farklar nelerdir?

c derleme zamanı sabit başlatıcısına sahipken, b yoktur. Derleme zamanı sabit başlatıcısı olan bir const nesnesinin kendisi derleme zamanı sabiti değeridir.

Bir sabiti bir sabitin 1'ini bir sabit kullanarak tanımlayabildiğim için, neden bu işe yaramıyor?

Sadece herhangi bir sabit olmaz. constniteleyici çalışma zamanı sabitliğini ifade eder (yani değer çalışma zamanında belirlenebilir, ancak nesnenin ömrü boyunca değişmez). Dizi boyutu olarak yalnızca derleme zaman sabiti değerleri kullanılabilir.


6

Bir sabite değer atamak için sabit olmayan bir değişken kullanıyorsunuz. Bu nedenle, bu değişkenin değeri derleme zamanı belirlenemez . Değişmediğini biliyorum a, ama derleyici böyle düşünmüyor.


4

Derleyici tanılama gerçekten zaman değerlendirilebilir sabit ifade derleme olmalıdır .

Hangi özgün nesne yana btahsis edilir değildir const, bderleme değişken uzunluk dizileri C ++ ve desteklenmeyen olarak başarısız olur, böylece bir derleme zamanı değerlendirilebilir sabit ifadesi değildir.


1

"Sabit" sadece değişkenin çalışma zamanında değişmeyeceği anlamına gelir ve derleme sırasında değerinin çıkarılabileceği anlamına gelmez.

Aradığın şey "constexpr" dir. Belki şu şekilde deneyebilirsiniz:

constexpr int b = 4; // can't be assigned from a!
int d[b];

Bunun yerine "constexpr" bir "gerçek const" anlamına gelir ve "const" sadece "değişmeyen var" anlamına gelir, çünkü bazı tarihsel nedenler. @Bathsheba'nın dediği gibi c ++ 'da yerel bir dizinin her zaman sabit uzunlukta olması gerektiği unutulmamalıdır.


Hangi "diğer diller" den bahsediyorsun?
Brian

1
@Brian Üzgünüm, ilgili değil. Cevabımı değiştirdim.
Leon

"Gerçek scotsman yok ..." - "constexpr" ile aynı fikirde değilim "gerçek const" anlamına gelir ve "const" sadece "değişmeyen var" deyimi anlamına gelir . "const", "const" anlamına gelir, "constexpr", "constexpr" anlamına gelir - c ++ dili bağlamında iki farklı anlamı ve sonucu vardır. "const", "Nesne değiştirilemez" anlamına gelir, "constexpr", "derleme zamanında işlevin veya değişkenin değerini değerlendirmek mümkün
CharonX

Üzgünüm, belki de yanlış ifade ettim. İngilizce benim anadilim değil.
Leon

1

"Sabit" terimi gerçekten belirsizdir ve anahtar kelime constyanıltıcıdır.

constşu anlama gelir: "bu nesnenin değerinin başlatılmasından sonra değiştirilmesine izin verme". O mu değil "derleme zamanı sabiti" demek. Başlangıç ​​değeri çalışma zamanı kaynaklarından gelebilir (ve genellikle gelir).

Bir dizi için derleme zamanı sabitine ihtiyacınız vardır.

Adında bir nesne olması bazen mümkündür foosorun olduğu takdirde derleme zamanı sabiti const ve o bir sabit veya benzeri sabit ifadeden başlatıldı edildi constexprşey. Durum böyle c; durum böyle değil b.

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.