Saya punya pertanyaan, bagaimana kompiler beroperasi pada kode berikut:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Saya tidak yakin mengapa hasilnya adalah d = 11
.
Saya punya pertanyaan, bagaimana kompiler beroperasi pada kode berikut:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Saya tidak yakin mengapa hasilnya adalah d = 11
.
Jawaban:
Dalam
int d = (b == c++) ? (c+1) : (c-1);
:c++
adalah nilai saat inic
, 11. Secara terpisah,c
bertambah menjadi 12.b == 11
salah, karenab
12.(b == c++)
salah,(c-1)
digunakan. Selain itu, peningkatanc
ke 12 harus diselesaikan pada titik ini.c
12,c-1
11.d
diinisialisasi ke nilai itu, 11.sumber
Menurut Standar C (operator kondisional 6.5.15)
Jadi dalam ekspresi awal deklarasi ini
variabel
b
dibandingkan dengan nilai variabelc
karena operator post-increment mengembalikan nilai operandnya sebelum menambahkannya.Karena nilainya tidak sama satu sama lain (
b
diatur ke 12 sementarac
diatur ke 11) maka sub-ekspresi(c-1)
dievaluasi.Menurut kutipan ada titik urutan setelah evaluasi kondisi operator. Ini berarti bahwa setelah evaluasi kondisi
c
memiliki nilai12
setelah menerapkan operator pasca kenaikan untuk variabelc
. Sebagai hasilnya, variabel d diinisialisasi dengan nilai1
(12 - 1
).sumber
?:
. Karena biasanya dalam C, menggabungkan++
dengan operasi lain pada operan yang sama adalah perilaku yang tidak terdefinisi. Dan kode ini hanya bisa ditebak karena?:
memiliki berbagai aturan kepingan salju khusus.Karena kondisinya salah, maka
false
kasusnya akan terjadi:,c-1
tetapi karena Anda bertambahc
dalam kondisi olehc++
, oleh karenac
itu sekarang12
. Hasilnya demikian 12 - 1 yaitu 11.EDIT: Apa yang disalahartikan OP adalah kenaikan pos.
Jadi yang sebenarnya terjadi adalah seperti ini:
sumber
c++
kondisinya. Kondisi salah, tapi kemudian asli nilaic
yang digunakan untuk menghitungc - 1
, bukan versi ditambah satu.c++
dan++c
c++
adalah operator pasca kenaikan. Nilaic++
11, dengan efek samping pembuatanc == 12
.++c
akan memiliki nilai 12.Diterjemahkan ke if-statement reguler, kode Anda akan terlihat seperti ini:
Petunjuk di sini adalah bahwa c bertambah setelah kondisi diperiksa. Jadi Anda memasuki
else
negara tetapi c sudah memiliki nilai 12 di sana.sumber
Lihat Operator Ternary.
Sintaksis
Jadi, Anda yang menulis
Dalam situasi ini, hasilnya akan menjadi 11 karena, setelah jika memeriksa, nilai 'c' meningkat (c + 1 = 12) dan hanya setelah itu ia menetapkan nilai 'd' sebagai c (12) -1 yang merupakan 11.
Jika Anda menggunakan, misalnya:
Nilai "c" akan ditingkatkan sebelum memeriksa pernyataan, jadi itu benar dan nilai "d" akan menjadi c (12) +1 yaitu 13.
sumber