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.