(++ i) ++ geçerliyken neden “++ i ++” geçersiz?


14

Aşağıdaki kodu ele alalım:

int main() {
    int i = 2;
    int b = ++i++;
    return 3;
}

Bir hata ile aşağıdakileri derler:

<source>: In function 'int main()':

<source>:3:16: error: lvalue required as increment operand

    3 |     int b = ++i++;

      |                ^~

Bu bana adil geliyor. Postfix artışının önek artışından daha yüksek önceliği vardır, bu nedenle kod olarak ayrıştırılır int b = ++(i++);ve ibir değerdir. Dolayısıyla hata.

Şimdi varsayılan varlıkları geçersiz kılmak için bu varyantı parantez içinde ele alalım:

int main() {
    int i = 2;
    int b = (++i)++;
    return 3;
}

Bu kod derler ve 3'ü döndürür. Kendi başına, bu bana adil geliyor ama ilk kodla çelişiyor gibi görünüyor.

Soru: neden (++i)bir lvaluezaman ideğil?

Teşekkürler!

GÜNCELLEME: yukarıda gösterilen hata mesajı gcc'den (x86-64 9.2) idi. İşte tam oluşturma: gcc ile hata

Clang x86-64 9.0.0'ın mesajı oldukça farklı: clang hatası

<source>:3:13: error: expression is not assignable

    int b = ++i++;

            ^ ~~~

GCC ile, sorun sonek operatörü ile olduğu izlenimini almak ve sonra dolaşırken can neden ++iTamam iken olduğu i, dolayısıyla benim soru değil. Clang ile sorunun önek operatörü ile ilgili olduğu daha açıktır.


Bu aslında C ile etiketlendi, kesinlikle geçerli değil C
Antti Haapala

Gerçekten üzgünüm! Davranışın C'de aynı olduğunu varsaydım ...
Bktero

Yanıtlar:


23

ive ++iher ikisi de değerlerdir, ama i++bir değerdir.

++(i++)önek ++uygulandığı için geçerli olamaz i++, bu bir değerdir. Ama (++i)++iyidir çünkü ++ibir değerdir.

C'de durumun farklı olduğunu unutmayın; i++ve ++iikisi de değerlerdir. (Bu, insanların neden C ve C ++ 'nın aynı kurallara sahip olduğunu varsaymayı bırakmaları gerektiğinin bir örneğidir. İnsanlar bu varsayımları sorularına ekler, bu da daha sonra çürütülmelidir.)


4

Bu beyan

int b = ++i++;

eşittir

int b = ++( i++ );

Postfix artış operatörü, artıştan önce işlenenin değerini döndürür.

C ++ 17 Standardından (8.2.6 Artış ve azalış)

1 Bir postfix ++ ifadesinin değeri, işleneninin değeridir ... Sonuç bir ön değerdir .

Tekli artış operatörü, artışından sonra değer döndürür. Yani bu beyan

int b = (++i)++;

geçerlidir. Örneğin yazabilirsiniz

int b = (++++++++i)++;

C ++ 17 Standardından (8.3.2 Artış ve azalma)

1 ++ önekinin işleneni 1 eklenerek değiştirilir. İşlenen değiştirilebilir bir değer olmalıdır. İşlenenin türü, cv bool dışında bir aritmetik tür veya tamamen tanımlanmış bir nesne türüne işaretçi olmalıdır. Sonuç güncellenen işlenen; bir değerdir ve işlenen bir bit alanı ise bir bit alanıdır ....

C'de her iki operatörün de değer yerine bir değer döndürdüğüne dikkat edin. Yani C'de bu beyan

int b = (++i)++;

geçersizdir.


3

kod int b = ++ (i ++) olarak ayrıştırılır; ve ben bir değerdir.

Hayır i. Bir değer değildir. ibir değerdir. i++bir değerdir (özgül değer).

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.