Saya punya kode berikut:
#include <stdio.h>
int main(int argc, char **argv) {
int i = 0;
(i+=10)+=10;
printf("i = %d\n", i);
return 0;
}
Jika saya mencoba mengkompilasinya sebagai sumber C menggunakan gcc, saya mendapatkan kesalahan:
error: lvalue required as left operand of assignment
Tetapi jika saya mengkompilasinya sebagai sumber C ++ menggunakan g ++ saya tidak mendapatkan kesalahan dan ketika saya menjalankan yang dapat dieksekusi:
i = 20
Mengapa perilakunya berbeda?
Jawaban:
Semantik dari operator penugasan majemuk berbeda di C dan C ++:
Standar C99, 6.5.16, bagian 3:
Di C ++ 5.17.1:
EDIT: Perilaku
(i+=10)+=10
di C ++ tidak ditentukan di C ++ 98, tetapi didefinisikan dengan baik di C ++ 11. Lihat jawaban atas pertanyaan NPE ini untuk bagian yang relevan dari standar.sumber
(i+=10)+=10
perilaku tidak terdefinisi di C ++, lihat jawaban @aix.int f(int &y); f(x += 10);
- meneruskan referensi ke variabel yang dimodifikasi ke dalam fungsi.Selain kode C tidak valid, baris
akan menghasilkan perilaku yang tidak terdefinisi di C dan C ++ 03 karena akan berubah
i
dua kali di antara titik urutan.Tentang mengapa itu diizinkan untuk dikompilasi di C ++:
Paragraf yang sama selanjutnya mengatakan itu
Ini menunjukkan bahwa di C ++ 11, ekspresi tidak lagi memiliki perilaku yang tidak ditentukan.
sumber
i
yang tidak diurutkan.i = j+=1
akan menghasilkan nilai yang tidak dapat ditentukan. Dari paragraf yang sama Anda mengutip "Dalam semua kasus, tugas diurutkan setelah penghitungan nilai operan kanan dan kiri, dan sebelum penghitungan nilai ekspresi penugasan." Oleh karena(i+=10)+=10
itu didefinisikan dengan baik untuk dilakukani += 10; i += 10;
. Di sisi lain(i+=10)+=(i+=10)
adalah UB.