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 i
bir 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 lvalue
zaman i
değ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 ++i
Tamam 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.