Mengapa pernyataan if ini, dengan penugasan dan pemeriksaan kesetaraan, dievaluasi menjadi salah?

105

Bagaimana pernyataan Java if bekerja ketika memiliki penugasan dan pemeriksa kesetaraan OR-d bersama-sama ??

public static void test() {
    boolean test1 = true; 
    if (test1 = false || test1 == false) {
        System.out.println("TRUE");
    } else {
        System.out.println("FALSE");
    }       
}

Mengapa pencetakan ini SALAH?

RoHaN
sumber
1
Jalankan dan periksa. Lihat nilai boolean apa yang dicetak jika Anda menetapkan salah dan jika Anda menetapkan benar. Kemudian baca tentang cara kerja OR.
Pratik
2
Saya ingin memberi tahu bahwa kode ini pada mode debug memberikan nilai TRUE dan pada mode Running memberikan nilai FALSE ... Mengapa demikian ??? ... (Saya meletakkan breakpoint saya pada kondisi jika) ...
CoderNeji
test1=false, test1==falseadalah false, false || falseadalah false or falseyang mana false.
Jared Burrows
Saya tahu Anda tidak meminta nasihat, tetapi karena jawaban di bawah menunjukkan masalah prioritas, berikut adalah beberapa praktik yang telah membantu saya menghindari masalah (jika saya tetap berpegang pada ini): (1) selalu gunakan tanda kurung jika tidak 100% prioritas tertentu atau untuk kemudahan keterbacaan untuk membantu pengembang lain. Jangan berasumsi bahwa orang lain akan mengingat aturan prioritas untuk semua operator (2) if-assignments umumnya harus dihindari untuk mengurangi kebingungan kecuali untuk kondisi-jika yang sangat sederhana. Ada beberapa pengecualian umum (terutama dengan pemeriksaan sederhana untuk I / O, jaringan, dll). Hanya dua sen saya.
rimsky
karenatest1 = true
jono

Jawaban:

189

Ekspresi tidak diurai seperti yang Anda pikirkan. Ini bukan

(test1=false) || (test1 == false)

dalam hal ini hasilnya akan seperti itu true, tapi

test1 = (false || test1 == false)

Nilai false || test1 == falseekspresi dihitung pertama kali, dan itu false, karena test1diatur untuk truemasuk ke komputasi.

Alasan itu diurai dengan cara ini adalah bahwa didahulukan dari ||lebih rendah dibandingkan dengan ==operator, tetapi lebih tinggi dari didahulukan dari operator penugasan =.

dasblinkenlight
sumber
2
+1 @RohanFernando, harap perhatikan juga bahwa jika Anda menambahkan tanda kurung di sekitar tugas seperti ini: ((test1 = false) || test1 == false)nilai keseluruhannya adalah true.
Arnon Zilca
1
Mohon tuliskan alasan mengapa penguraian terjadi begitu ... Apakah karena urutan prioritas operator?
kondu
3
@kondu Itu pertanyaan tindak lanjut yang adil, saya mengedit untuk menambahkan tautan ke tabel prioritas, yang menunjukkan di ==atas ||, tetapi di =bawah ||.
dasblinkenlight
Paragraf terakhir menyesatkan, dalam arti bahwa untuk memahami mengapa penguraian kedua dipilih daripada yang pertama, cukup mengetahui aturan (mudah diingat) bahwa tugas memiliki prioritas yang lebih rendah dari operator non-penugasan mana pun (di sini ||). Urutan relatif dari ||dan ==hanya relevan untuk menunjukkan bahwa penguraian tidak seperti dalam test1 = ((false || test1) == false), yang menurut saya tidak akan diharapkan oleh siapa pun (dengan cara bahwa prioritas relatif, atau lebih umum ||, &&memiliki prioritas lebih rendah daripada relasi, juga mudah dilakukan. ingat, karena digunakan sepanjang waktu).
Marc van Leeuwen
1
@MarcvanLeeuwen Prioritas relatif dari ||dan ==vs ||dan =menjelaskan mengapa ini berperilaku berbeda dari kasus (umum) a == b || c == d.
Aaron Dufour
83

Ini adalah masalah prioritas, pada dasarnya. Anda berasumsi bahwa kode Anda setara dengan:

if ((test1 = false) || (test1 == false))

... tapi tidak. Ini sebenarnya setara dengan:

if (test1 = (false || test1 == false))

... yang setara dengan:

if (test1 = (false || false))

(karena test1ini trueuntuk memulai dengan)

... yang setara dengan:

if (test1 = false)

yang menetapkan nilai falseke test1, dengan hasil ekspresi menjadi false.

Lihat tutorial Java tentang operator untuk tabel berguna tentang prioritas operator.

Jon Skeet
sumber
2

silakan lihat prioritas operator

Ekspresi test1 = false || test1 == falseakan dievaluasi pada langkah berikutnya.

LANGKAH: 1- test1 = false || test1 == false // diutamakan dari ==yang tertinggi

LANGKAH: 2- test1 = false || false // Operator ||memiliki prioritas lebih tinggi

LANGKAH: 3- test1 = false

LANGKAH: 4- false

Karena nilai ekspresi boolean menjadi false. Jadi pernyataan lain sedang dieksekusi.


sumber
-11

(test1 = false || test1 == false)mengembalikan salah, karena keduanya salah. (test1 = false || test1 == true)ini benar karena salah satunya benar

Sarang
sumber
1
Sangat salah. Mengapa Anda menjawab dengan informasi yang salah beberapa hari setelah pertanyaan menerima dua jawaban berkualitas tinggi yang menggambarkan apa yang terjadi?
l4mpi
5
Dua jawaban dengan kualitas rendah seperti itu tidak pantas mendapat komentar tertulis satu per satu. Anda menyadari jawaban Anda tidak masuk akal, bukan? Jika tidak, baca dua jawaban Jon dan blinkenlight dengan cermat.
l4mpi