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.
Jawaban:
i
dan++i
keduanya adalah nilai, tetapii++
merupakan nilai.++(i++)
tidak dapat valid, karena awalan++
sedang diterapkani++
, yang merupakan nilai. Tetapi(++i)++
baik-baik saja karena++i
merupakan nilai.Perhatikan bahwa dalam C, situasinya berbeda;
i++
dan++i
keduanya adalah nilai. (Ini adalah contoh mengapa orang harus berhenti dengan asumsi bahwa C dan C ++ memiliki aturan yang sama. Orang memasukkan asumsi ini ke dalam pertanyaan mereka, yang kemudian harus disangkal.)sumber
Deklarasi ini
setara dengan
Operator increment postfix mengembalikan nilai operan sebelum increment.
Dari Standar C ++ 17 (8.2.6 Peningkatan dan penurunan)
Sementara operator kenaikan unary mengembalikan nilai setelah kenaikannya. Jadi deklarasi ini
adalah benar. Anda bisa misalnya menulis
Dari Standar C ++ 17 (8.3.2 Peningkatan dan penurunan)
Perhatikan bahwa dalam C kedua operator mengembalikan nilai alih-alih nilai. Jadi dalam C deklarasi ini
tidak valid.
sumber
Tidak.
i
Itu bukan nilai.i
adalah nilai.i++
adalah nilai (prvalue untuk lebih spesifik).sumber