Mari kita pertimbangkan kode berikut:
int main() {
int i = 2;
int b = ++i++;
return 3;
}
Ini mengkompilasi dengan yang berikut ini dengan kesalahan:
<source>: In function 'int main()':
<source>:3:16: error: lvalue required as increment operand
3 | int b = ++i++;
| ^~
Ini kedengarannya adil bagi saya. Peningkatan postfix memiliki prioritas lebih tinggi daripada kenaikan awalan, sehingga kode diuraikan sebagai int b = ++(i++);
dan i
merupakan nilai. Karena itu kesalahannya.
Sekarang mari kita pertimbangkan varian ini dengan tanda kurung untuk mengesampingkan prioritas default:
int main() {
int i = 2;
int b = (++i)++;
return 3;
}
Kode ini mengkompilasi dan mengembalikan 3. Sendiri, ini terdengar adil bagi saya tetapi tampaknya bertentangan dengan kode pertama.
Pertanyaannya: mengapa (++i)
adalah lvalue
ketika i
tidak?
Terima kasih!
UPDATE: pesan kesalahan yang ditunjukkan di atas adalah dari gcc (x86-64 9.2). Berikut ini render yang tepat: kesalahan dengan gcc
Dentang x86-64 9.0.0 memiliki pesan yang sangat berbeda: kesalahan dengan dentang
<source>:3:13: error: expression is not assignable
int b = ++i++;
^ ~~~
Dengan GCC, Anda mendapat kesan bahwa masalahnya ada pada operator postfix dan Anda kemudian dapat mengembara mengapa ++i
tidak apa-apa sementara i
tidak, maka pertanyaan saya. Dengan Dentang lebih jelas bahwa masalahnya ada pada operator awalan.