Eğer ifade, bir atama ve eşitlik kontrolüyle birlikte neden yanlış olarak değerlendiriliyorsa bu?


105

Java if deyimi , bir atama ve eşitlik kontrolü OR-d birlikte olduğunda nasıl çalışır ?

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

Bu yazdırma neden YANLIŞ?


1
Çalıştır ve kontrol et. False atarsanız ve true değerini atarsanız hangi boole değerinin yazdırıldığını görün. Ardından, OR'nin nasıl çalıştığını okuyun.
Pratik

2
Hata ayıklama modundaki bu kodun DOĞRU değer verdiğini ve Çalıştırma modunda YANLIŞ değer verdiğini söylemek istiyorum ... Neden bu kadar ??? ... (eğer koşul ise kesme
noktamı koydum

test1=false, test1==falseOlan false, false || falsebir false or falseolan false.
Jared Burrows

Tavsiye istemediğini biliyorum, ancak aşağıdaki cevaplar bir öncelik sorununu belirlediğinden, işte sorunlardan kaçınmama yardımcı olan birkaç uygulama (bunlara bağlı kaldığımda): (1)% 100 olmasa da her zaman parantez kullanın belirli bir öncelik veya diğer geliştiricilere yardımcı olmak için daha kolay okunabilirlik için. Başkalarının tüm operatörler için öncelik kurallarını hatırlayacağını varsaymayın (2) if-atamalarından, karışıklığı azaltmak için genellikle çok basit if-koşulları dışında kaçınılmalıdır. Bazı genel istisnalar vardır (özellikle G / Ç, ağ bağlantısı vb. İçin basit kontroller). Sadece iki sentim.
rimsky

çünkütest1 = true
jono

Yanıtlar:


189

İfade, sizin düşündüğünüz şekilde ayrıştırılmaz. Değil

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

bu durumda sonuç olurdu true, ama

test1 = (false || test1 == false)

Değeri false || test1 == falseifadesi ilk hesaplanır ve o falseçünkü test1ayarlandığında truehesaplama girecek.

Bu şekilde ayrıştırılır nedeni olmasıdır öncelik ait ||daha düşüktür ==operatör, ancak atama operatörünün önceliği daha yüksek =.


2
+1 @RohanFernando, lütfen ödevin etrafına parantez eklerseniz ((test1 = false) || test1 == false)genel değerin olacağını unutmayın true.
Arnon Zilca

1
Lütfen ayrıştırmanın neden böyle olduğunu yazınız ... Operatörlerin öncelik sırasından mı kaynaklanıyor?
kondu

3
@kondu Bu adil bir takip sorusu, bir öncelik tablosuna bir bağlantı eklemek için düzenledim, bu ==yukarıdaki ||ama =aşağıda olduğunu gösteriyor ||.
dasblinkenlight

Son paragraf, neden birinci değil de ikinci ayrıştırmanın seçildiğini anlamak açısından yanıltıcıdır, atamanın herhangi bir atama olmayan operatörün (burada ||) daha düşük önceliğe sahip olduğu (kolayca hatırlanan) kuralını bilmek yeterlidir . Ayrıştırmanın göreli önceliği ||ve ==yalnızca, ayrıştırmanın, kimsenin makul bir şekilde bekleyeceğini düşünmediğim gibi olmadığını göstermekle ilgilidir test1 = ((false || test1) == false)(göreli önceliğin ya da daha genel olarak ||, &&ilişkilerden daha düşük önceliğe sahip olması da kolaydır. her zaman kullanıldığından beri hatırlayın).
Marc van Leeuwen

1
@MarcvanLeeuwen Göreli önceliği ||ve ==vs ||ve =bunun neden (ortak) durumundan farklı davrandığını açıklar a == b || c == d.
Aaron Dufour

83

Bu temelde bir öncelik sorunudur. Kodunuzun aşağıdakilere eşdeğer olduğunu varsayıyorsunuz:

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

... ama değil. Aslında şuna eşdeğerdir:

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

... eşdeğer olan:

if (test1 = (false || false))

(nedeniyle test1olduğu truebaşlamak)

... eşdeğer olan:

if (test1 = false)

bu değer atar falseiçin test1sentezleme varlık sonucu ile, false.

Kullanışlı bir operatör öncelik tablosu için operatörler hakkındaki Java eğitimine bakın .


2

lütfen operatörlerin önceliğine bir göz atın

İfade test1 = false || test1 == false, sonraki adımda değerlendirilecektir.

ADIM: 1- test1 = false || test1 == false // önceliği ==en yüksektir

ADIM: 2- test1 = false || false // Operatör ||daha yüksek önceliğe sahiptir

AŞAMA 3- test1 = false

ADIM: 4- false

İfadenin boole değeri yanlış olduğundan, aksi takdirde ifade çalıştırılıyor.


-11

(test1 = false || test1 == false)yanlış döndürür, çünkü ikisi de yanlıştır. (test1 = false || test1 == true)bu doğru çünkü onlardan biri doğru


1
Tamamen yanlış. Soru, neler olduğunu açıklayan iki yüksek kaliteli yanıt aldıktan sonra neden bu kadar yanlış bilgilerle cevap veriyorsunuz?
l4mpi

5
Bu kadar düşük kalitede iki yanıt, bireysel olarak yazılmış yorumları hak etmiyor. Cevabınızın saçma olduğunun farkındasınız, değil mi? Değilse, Jon ve blinkenlight'ın iki cevabını dikkatlice okuyun.
l4mpi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.