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 ini c
, 11. Secara terpisah, c
bertambah menjadi 12.b == 11
salah, karena b
12.(b == c++)
salah, (c-1)
digunakan. Selain itu, peningkatan c
ke 12 harus diselesaikan pada titik ini.c
12, c-1
11.d
diinisialisasi ke nilai itu, 11.Menurut Standar C (operator kondisional 6.5.15)
4 Operan pertama dievaluasi; ada titik urutan antara evaluasinya dan evaluasi operan kedua atau ketiga (mana yang dievaluasi). Operan kedua dievaluasi hanya jika yang pertama membandingkan tidak sama dengan 0; operan ketiga dievaluasi hanya jika yang pertama sebanding dengan 0; hasilnya adalah nilai operan kedua atau ketiga (mana yang dievaluasi), dikonversi ke jenis yang dijelaskan di bawah ini.110)
Jadi dalam ekspresi awal deklarasi ini
int d = (b == c++) ? (c+1) : (c-1);
variabel b
dibandingkan dengan nilai variabel c
karena operator post-increment mengembalikan nilai operandnya sebelum menambahkannya.
Karena nilainya tidak sama satu sama lain ( b
diatur ke 12 sementara c
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 nilai 12
setelah menerapkan operator pasca kenaikan untuk variabel c
. Sebagai hasilnya, variabel d diinisialisasi dengan nilai 1
( 12 - 1
).
?:
. 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 bertambah c
dalam kondisi oleh c++
, oleh karena c
itu sekarang 12
. Hasilnya demikian 12 - 1 yaitu 11.
EDIT: Apa yang disalahartikan OP adalah kenaikan pos.
Jadi yang sebenarnya terjadi adalah seperti ini:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d;
if (b == c) { // 12 == 11 ? -> false
c = c + 1;
d = c + 1;
} else { // this executes since condition is false
c = c + 1; // post increment -> c++ -> c = 12 now
d = c - 1; // 12 - 1 = 11 -> d = 11
}
printf("d = %i\n", d);
}
c++
kondisinya. Kondisi salah, tapi kemudian asli nilai c
yang digunakan untuk menghitung c - 1
, bukan versi ditambah satu.
c++
dan++c
c++
adalah operator pasca kenaikan. Nilai c++
11, dengan efek samping pembuatan c == 12
. ++c
akan memiliki nilai 12.
Lihat Operator Ternary.
Sintaksis
kondisi ? value_if_true: value_if_false
Jadi, Anda yang menulis
int d = (b == c++) ? (c+1) : (c-1);
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:
int d = (b == ++c) ? (c+1) : (c-1);
Nilai "c" akan ditingkatkan sebelum memeriksa pernyataan, jadi itu benar dan nilai "d" akan menjadi c (12) +1 yaitu 13.