Saya telah memikirkan beberapa kesalahan pemula dan saya berakhir dengan satu di if
pernyataan itu. Saya memperluas sedikit kode untuk ini:
int i = 0;
if (i = 1 && i == 0) {
std::cout << i;
}
Saya telah melihat bahwa if
pernyataan pengembalian yang benar, dan itu cout
's i
sebagai 1
. Jika i
ditugaskan 1
dalam pernyataan if, mengapa i == 0
kembali true
?
c++
if-statement
TehMattGR
sumber
sumber
i
diatur ke1
.1 && i == 0
?Jawaban:
Ini ada hubungannya dengan prioritas operator .
tidak
karena keduanya
&&
dan==
memiliki prioritas lebih tinggi daripada=
. Apa yang benar-benar berhasil adalahyang menetapkan hasil
1 && (i == 0)
untuki
. Jadi, jikai
mulai saat0
itui == 0
adalahtrue
, begitu1 && true
jugatrue
(atau1
), dan kemudiani
diatur ke1
. Maka sejak1
itu benar, Anda memasukkan blok if dan mencetak nilai yang Anda tetapkani
.sumber
i = !i; if (i)
ditulis dengan benarDengan asumsi kode Anda benar-benar terlihat seperti ini:
Lalu ini:
mengevaluasi sebagai
dan
i
diatur ke1
.sumber
using namespace std
!=
datang sebelum&&
dapat melihat masalah. Juga, ya, ekspansi itu asing, tapi saya pikir itu tidak penting. Saya tidak percaya perbedaan kecil seperti itu menyebabkan orang memilih 151 hingga -4.Itu ada hubungannya dengan parsing hak untuk meninggalkan aturan. Misal y = x + 5.
Semua sub-ekspresi diberi bobot penting. Dua ekspresi sama pentingnya dievaluasi dari kanan ke kiri,. Sisi && ekspresi dilakukan terlebih dahulu, diikuti oleh LHS.
Masuk akal bagi saya.
sumber
Jawaban sebenarnya adalah:
Sebagai bukti, lihat saja asm output dari kompiler Anda untuk kode yang Anda masukkan (semua komentar adalah milik saya):
Output asm di atas berasal dari CLANG, tetapi semua kompiler lain yang saya lihat memberikan hasil yang serupa. Ini berlaku untuk semua kompiler di situs itu, apakah mereka adalah kompiler C murni atau C ++, semua tanpa pragma untuk mengubah mode kompiler (yang secara default adalah C ++ untuk kompiler C ++)
Perhatikan bahwa kompiler Anda tidak benar-benar mengatur i = 1, tetapi i = BENAR (yang berarti 32-bit bukan nilai integer nol). Itu karena operator && hanya mengevaluasi apakah pernyataan itu BENAR atau SALAH, dan kemudian menetapkan hasil sesuai dengan hasil itu. Sebagai bukti, coba ubah i = 1 ke i = 2 dan Anda dapat mengamati sendiri bahwa tidak ada yang akan berubah. Lihat sendiri menggunakan kompiler online di Compiler Explorer
sumber
i = 1
adalah operator penugasan [bukan kesetaraan]; 2b) Saya dapat meyakinkan Anda bahwaif (i = 0)
akan mengevaluasi ke kondisi salah di C dan C ++, jadi apakah itu mengevaluasi ke true WRT "itu tidak pernah gagal" agak menyesatkan.and cl, 1 ; = operator always TRUE
<< koreksi saya jika saya salah, tapi saya tidak melihat tugas di sini. Ini mewakili1 &&
bagian dari ekspresi. Jadi jawaban ini pada dasarnya mengevaluasifalse
.if ( i = 0 ) { print something }
. Juga jawaban Anda bertentangan dengan dirinya sendiri; di awal Anda mengatakan bahwai=1
dievaluasi sebelum&&
diterapkan, dan kemudian pada akhirnya Anda mengatakan bahwai
diatur ke hasil&&
operator.