Java neden tam olarak (C) varsa (5) {…} gibi sayısal koşullara izin vermiyor?


33

Bu iki küçük programım var:

C

#include <stdio.h>
int main()
{
    if (5) {
        printf("true\n");
    }
    else {
        printf("false\n");
    }

    return 0;
}

Java

class type_system {
   public static void main(String args[]) {
       if (5) {
           System.out.println("true");
       }
       else {
           System.out.println("false");
       }
   }
}

hata mesajını bildiren:

type_system.java:4: error: incompatible types: int cannot be converted to boolean
       if (5) {
           ^
1 error

Benim anlayışım

Şimdiye kadar bu örneği farklı tip sistemlerin bir gösterimi olarak anladım. C daha zayıf yazılmıştır ve int'den boolean'a hatasız dönüşüme izin vermektedir. Java, daha güçlü şekilde yazılmıştır ve örtük bir görüşmeye izin verilmediğinden başarısız olmaktadır.

Dolayısıyla benim sorum: Bir şeyi nerede yanlış anladım?

Ne aramıyorum

Benim sorum kötü kodlama tarzı ile ilgili değil. Kötü olduğunu biliyorum, ama neden C'nin izin verdiği ve Java'nın izin vermediği ile ilgileniyorum. Bu nedenle, dilin tür sistemine, özellikle de sağlamlığına ilgi duyuyorum.


22
@toogley: Java'da özellikle bilmek istediğiniz türdeki sistem nedir? Yazım sistemi buna izin vermiyor çünkü dil özellikleri yasaklıyor. C'nin ve Java'nın izin vermesinin nedenleri, her iki dilde de kabul edilebilir olarak kabul edilenlerle ilgisi yok. Tip sistemlerin ortaya çıkan davranış etkisi Bunun nedeni değil.
Robert Harvey

8
@toogley: neden bir şeyi yanlış anladığını düşünüyorsun? Metni tekrar okumak, sorunuzun ne olduğunu anlamıyorum.
Doktor Brown

26
Aslında, bu C'de zayıf bir yazma örneği değildir . Geçmişte (C89), C'nin bir boolean türü bile yoktu, bu nedenle tüm "boolean" işlemleri aslında intdeğerler üzerinden gerçekleştirildi . Daha uygun bir örnek olurdu if (pointer).
Rufflewind

5
Oy verdim çünkü bunu anlamaya çalışarak çok fazla araştırma yapılmış gibi görünmüyor.
jpmc26

11
Sorulan asıl sorunun düzenlenen versiyondan biraz farklı olduğu görülüyor (bu nedenle bazı yorumların ve yanıtların bazıları farklı bir soruyu cevaplıyor gibi görünüyor). Mevcut haliyle, burada bir soru görünmüyor. Ne yanlış anlama? Java tam olarak düşündüğünüz gibi davranıyor.
jamesdlin

Yanıtlar:


134

1. C ve Java farklı dillerdir.

Farklı davranmaları gerçeği çok şaşırtıcı olmamalıdır.

2. Cı herhangi bir dönüştürme çıkmıyor intiçinbool

Nasıl olabilir? C 1999 yılına kadarbool dönüştürmek için gerçek bir tür bile yoktu . C 1970'lerin başlarında yaratıldı ve B 1 için bir dizi değişiklik olduğu zaman bile C olmadı .if

ifNOPNeredeyse 30 yıl boyunca sadece bir C değildi . Doğrudan sayısal değerlere etki etti. C standardında ( PDF bağlantısı ), bools'nin C'ye girmesinden on yıldan sonra bile , yine de, "0'a eşit değil" ve "0'a eşit" terimlerini kullanan if(p 148) ve ?:(p 100) davranışlarını belirlemektedir. "Boole terimleri yerine" doğru "veya" yanlış "veya benzer bir şey.

Uygun olarak ...

3. ... sayılar sadece işlemcinin talimatlarının çalıştığı gibi oluyor.

JZve JNZkoşullu dallanma için temel x86 montaj talimatınızdır. Kısaltmalar "dir J UMP ise Z ero" ve " J UMP halinde N yerine Z ERO". PDP-11, C kökenli için eşdeğer vardır BEQ( " B ise ahır EQ UAL ") ve BNE(" B ahır halinde N adlı E Qual").

Bu talimatlar, önceki işlemin sıfırla sonuçlanıp sonuçlanmadığını kontrol eder ve buna göre atlama (veya değil) yapar.

4. Java, güvenlik konusunda C'nin hiç yapmadığından çok daha fazla vurgu yaptı 2

Ve, güvenlik göz önünde bulundurularak, onlar kısıtlayan karar verdi ifiçin booleans maliyet (örneğin bir kısıtlama uygulandığında, her iki ve elde fırsat maliyetleri) değerdi.


1. B'nin hiç türü bile yok. Meclis dilleri de genelde değildir. Yine de, B ve assembly dilleri dallanmayı çok iyi idare ediyor.

2. B'ye yapılan planlı değişiklikleri tarif ederken Dennis Ritchie'nin sözleriyle (vurgu madeni):

... karakterlerle ve bayt adreslemeyle başa çıkabilmek ve yeni kayan nokta donanımına hazırlanmak için bir yazım düzeninin gerekli olduğu görülüyordu. Diğer tipler, özellikle de tip emniyet ve arayüz kontrolü, daha sonra oldukları kadar önemli görünmüyordu .


13
Doğrudan C işlemcisinde boolean ifadeler hakkında güzel bir nokta doğrudan işlemci talimatlarına. Bunu daha önce düşünmemiştim.
Robert Harvey

17
Bence, 4. nokta, C'nin güvenlik odağı smidgenine sahip olduğunu ima ettiği gibi yanıltıcı olduğunu düşünüyorum ... C, temelde istediğiniz her şeyi yapmanıza izin verecektir: C, yaptığınız şeyi bildiğini varsayar, genellikle olağanüstü derecede feci sonuçlar.
TemporalWolf

13
@TemporalWolf C'nin istediğini yapmana izin vermesinin kötü olduğunu söylersin. Bence fark, C programcılar için yazılmış ve temel bir yetkinlik bekleniyor olmasıdır. Java, kod maymunları için yazılmıştır ve yazabiliyorsanız programlayabilirsiniz. Genellikle olağanüstü derecede kötü ama kimin umurunda ki? Giriş Java sınıfındaki bir öğretmenin CS küçüklüğümün bir parçası olarak almaya zorlandığını asla unutmayacağım, Fibonnaci sayılarını hesaplamak için özyinelemeyi kullanmanın yararlı olabileceğine dikkat çekti. Bu yüzden sahip olduğumuz yazılıma sahibiz.
DRF,

25
@DRF Bir C ağ sınıfı profesörümden biri "C, tüm pimler çekilmiş durumdayken bir el bombası kutusu gibidir" dedi. Çok fazla güce sahipsin, ama esasen yüzünde patlaması garantili. Vakaların büyük çoğunluğunda, uğraşmaya değmez ve daha yüksek bir dille çok daha üretken olacaksınız. Hızda 6 büyüklükte bir artış elde etmek için Python'u kesik C bit bükme işlemine dönüştürdüm mü? Evet, evet. Ancak bu istisnadır, kural değil. Python'da bir güne C'de iki hafta süren şeyi başarabilirim ... ve ben iyi bir C programcısıyım.
Temporal

11
@DRF Birinci sınıf şirketler tarafından geliştirilen mainstream yazılımda tampon taşması istismarlarının yaygınlığı göz önüne alındığında, görünüşe göre temel yetkinliğe sahip programcıların bile ayaklarını vurmamaları güvenilir değildir.
Monica'yı

14

C 2011 Çevrimiçi Taslak

6.8.4.1 ifdeyim

Sınırlamalar

1 bir kontrolü ifadesi ifdeyimi skaler türüne sahip olmalıdır.

Anlamsallık

2 Her iki formda da, ifade 0 ile eşit değilse karşılaştırılırsa ilk alt işlem yürütülür. elseFormda, ikinci alt ifade, ifade 0'a eşitse karşılaştırılır. İlk alt değer bir etikete erişilirse ikinci alt değer Gerçekleştirilemedi.

3 bir elseo sözdizimini tarafından izin verilirse, lexically en yakın önceki ile ilişkilidir.

Bu fıkranın yalnızca kontrol ifadesinin özel olarak bir Bool türü değil , bir skalar tipine ( char/ short/ int/ long/ / vb.) Sahip olacağını belirtti. Bir kontrol ifadesi sıfır olmayan bir değere sahipse, bir dal yürütülür.

Şununla karşılaştır

Java SE 8 Dil Özellikleri

14.9 ifBeyanı ifadesi açıklamada koşullu yürütülmesine veya iki tabloların bir koşullu seçim, yürütme birini veya diğer ancak ikisini verir.

if
    IfThenStatement :
        if ( İfade ) Beyanı

    IfThenElseStatement :
        if ( Expression ) StatementNoShortIf else Deyimi

    IfThenElseStatementNoShortIf :
        if ( Expression ) StatementNoShortIf else StatementNoShortIf
İfade türü olmalıdır booleanya Booleanya da bir derleme zamanı hatası oluşur.

Java, OTOH, özellikle bir ifadedeki kontrol ifadesinin ifbir Boole türüne sahip olmasını gerektirir .

Bu yüzden, zayıf ve güçlü yazarak ilgili değil, her bir dil tanımının geçerli bir kontrol ifadesi olarak belirttiği şeyle ilgili.

Düzenle

Gelince neden diller bu özel saygı, birkaç noktalar farklıdır:

  1. C, "tipik olmayan" bir dil olan B'den türetilmiştir - temel olarak, her şey 32 - 36 bitlik bir kelimeydi (donanıma bağlı olarak) ve tüm aritmetik işlemler tamsayı işlemleridir. C'nin tip sistemi bir seferde biraz cıvatalanmıştı, öyle ki ...

  2. C, dilin 1999 sürümüne kadar belirgin bir Boole türüne sahip değildi. C basitçe B'yi temsil etmek için sıfır kullanma ve temsil etmek için sıfır falseolmayan kullanma yöntemini takip etti true.

  3. Java, C'leri birkaç on yıl öncesine göre tarihlendirir ve C ve C ++ 'nın bazı eksikliklerini gidermek için özel olarak tasarlanmıştır. Şüphe yok ki, bir ifadedeki kontrol ifadesinin ne olabileceği konusundaki kısıtlamayı sıkılaştırmanın bir ifparçasıydı.

  4. Beklemek için bir neden yoktur herhangi iki programlama dilleri şeyi aynı şekilde yapmaya. C ve C ++ ile yakından ilişkili diller bile, bazı ilginç şekillerde farklılık gösterir; öyle ki, yasal C ++ programları olmayan veya yasal C ++ programları olan ancak farklı semantiklere sahip yasal C programlarına sahip olabilirsiniz.


Çok üzücü, iki cevabı "kabul edildi" olarak işaretleyemem ..
toogley

1
Evet, bu sorunun iyi bir şekilde tekrarı. Ancak soru, neden iki dil arasında bu fark olduğunu sordu . Buna hiç değinmedin.
Dawood, Monica

@DawoodibnKareem: C den dönüşüm neden izin soru intiçin booleanJava ise etmedikleri. Cevap, C’de böyle bir dönüşüm olmamasıdır. Diller farklıdır çünkü diller farklıdır.
John Bode

Evet, "zayıf ve güçlü yazma hakkında değil". Sadece otomatik boks ve otomatik unboxing bakın. Eğer C bunlara sahipse, herhangi bir skaler tipe de izin veremezdi.
Deduplicator

5

Yanıtların çoğu, koşullu ifadenin içindeki gömülü atama ifadesini hedefliyor gibi görünüyor. (Bu bilinen bir potansiyel çöküntü türü olsa da, bu durumda Java hata mesajının kaynağı değildir.)

Muhtemelen bunun nedeni OP'nin fiili hata mesajını yayınlamamasıdır. ^ şapka doğrudan =atama operatörünü işaret eder.

Bununla birlikte, derleyici, =koşulun gördüğü ifadenin nihai değerini (ve dolayısıyla son tipini) üreten operatör olduğu için işaret etmektedir .

Boolean olmayan bir değeri test etmekle ilgili olarak aşağıdaki hatayı şikayet ediyor:

error: uyumsuz türler: int, boole değerine dönüştürülemez

Tam sayıların test edilmesi, bazen uygun olsa da, Java tasarımcılarının kaçınmayı seçtiği potansiyel bir sorun olarak kabul edilir. Sonuçta, Java, C'nin sahip olmadığı gerçek bir boolean veri türüne sahiptir (boolean türü yoktur) .

Bu aynı zamanda C'nin boş olan / boş olmayanlar için test işaretçilerine uyguladığı if (p) ...ve if (!p) ...Java'nın benzer bir şekilde gerekli booliyi elde etmesini gerektiren açık bir karşılaştırma operatörüne izin vermediği için de geçerlidir .


1
C does bir boolean türü var. Ama bu ififadeden daha yeni .
MSalters

3
@ MS C'lerin bool'u hala örtülerin altında bir tamsayıdır, dolayısıyla yapabilirsiniz bool b = ...; int v = 5 + b;. Bu, aritmetik olarak kullanılamayan bir tam boolean türüne sahip dillerden farklıdır.
Jules

C'nin boole'si sadece küçük bir tam sayıdır. "true" ve "false", makrolarla veya her neyse kolayca tanımlanabilir.
Oskar Skog

4
@Jules: Sadece C'nin zayıf tip güvenliğine sahip olduğunu işaret ediyorsun. Boole türünün bir tamsayı değerine dönüştürülmesi , bunun bir tamsayı türü olduğu anlamına gelmez . Mantığınıza göre, tamsayı türleri int v = 5; float f = 2.0 + v;, C'de yasal olduğundan kayan nokta türleri olacaktır
MSalters

1
@ MSalters aslında Standard tarafından tanımlanan standart işaretsiz tamsayı tiplerinden_Bool biridir (bkz. 6.2.5 / 6).
Ruslan

2

uyumsuz türler: int, boole değerine dönüştürülemez

C'nin neden izin vermediğini ve java'nın izin vermediğini düşünüyorum. Bu nedenle, dilin tür sistemine, özellikle de sağlamlığına ilgi duyuyorum.

Sorunuz için iki bölüm var:

Java neden dönüştürmüyor? int için boolean?

Bu, Java'nın mümkün olduğu kadar açık olması amaçlanmasına neden oluyor. Tip sistemiyle çok statik, çok “yüzünüzde”. Diğer dillerde otomatik olarak yazılan şeyler Java'da değildir. Sen de yazmalısın int a=(int)0.5. Bilgi dönüştürme float, intbilgi kaybına neden olur; dönüştürme ile aynıint için booleanve bu şekilde hataya eğilimli olacaktır. Ayrıca, birçok kombinasyon belirtmek zorunda kalacaklardı. Tabii ki, bu şeyler açık gözüküyor, ancak dikkatli olmak istiyorlar.

Oh, ve diğer dillere kıyasla, Java derece oldu sadece bytecode sadece bir dahili uygulama detayı olmadığı için, tarifnamesinde kesindi. Her türlü etkileşimi kesin olarak belirtmeleri gerekirdi. Büyük girişim.

Neden ifbaşka tipler kabul etmiyorboolean ?

ifdışında diğer tiplere izin verecek şekilde kusursuz olarak tanımlanabilir boolean. Aşağıdakilerin eşdeğer olduğunu söyleyen bir tanımı olabilir:

  • true
  • int != 0
  • String ile .length>0
  • Diğer olmayan null(ve Booleandeğeri olmayan) bir nesne başvurusu false.
  • Veya hatta: olmayan nullve onun yöntemi Object.check_if(sadece bu vesileyle benim tarafımdan icat edilmiş) geri dönen başka herhangi bir nesne referansı true.

Yapmadılar; gerçek bir ihtiyaç yoktu ve mümkün olduğunca sağlam, statik, şeffaf, okunması kolay vb. olmasını istediler. Örtük özellikler yok. Ayrıca, uygulama oldukça karmaşık olurdu, eminim, tüm olası durumlar için her bir değeri test etmek zorunda kaldım, bu yüzden performans da küçük bir faktör oynayabilirdi (Java o günün bilgisayarlarında sloooowdu; ilk sürümleri olan JIT derleyicileri değildi, en azından o zaman kullandığım bilgisayarlarda).

Daha derin nedeni

Daha derin bir sebep, Java'nın ilkel türlerine sahip olması olabilir, bu nedenle tür sistemi nesneler ve ilkel öğeler arasında parçalanır. Belki, onlardan uzak dursaydı, işler başka bir şekilde ortaya çıkardı. Önceki bölümde verilen kurallarla, her ilkel ilkenin doğruluğunu açıkça tanımlamak zorunda kalacaklardı (çünkü ilkeller süper bir sınıfı paylaşmazlar ve nullilkeller için iyi bir tanım yoktur ). Bu hızla bir kabusa dönüşürdü.

Görünüm

Sonunda, belki de sadece dil tasarımcılarının tercihi. Her dilin kendi yolunda döndüğü görülüyor ...

Örneğin, Ruby'nin ilkel türleri yoktur. Her şey, kelimenin tam anlamıyla her şey bir nesnedir. Her nesnenin belirli bir yöntemi olduğundan emin olmak için çok kolay zamanları vardır.

Ruby, üzerine atabileceğiniz her türlü nesne üzerinde doğruluk arar. İlginçtir ki, hala bir booleantipi yoktur (çünkü ilkelleri yoktur) ve onun da Booleansınıfı yoktur . Değerin hangi sınıfa truesahip olduğunu sorarsanız (kolayca kullanılabilir true.class), elde edersiniz TrueClass. Bu sınıf aslında, booleanlar ( | & ^ ==) için 4 işleç gibi yöntemlere sahiptir . Burada, ifdeğeri falsey olarak kabul edilir ve sadece ya falseda nil( nullRuby) ise. Her şey doğrudur. Yani, 0ya ""da her ikisi de doğrudur.

Object#truthy?Herhangi bir sınıf için uygulanabilecek ve bireysel bir gerçeği geri döndürebilecekleri bir yöntem oluşturmaları önemsiz olurdu . Örneğin, String#truthy?boş olmayan dizeler için doğru olması için uygulanmış olabilir ya da olmasın. Ruby, çoğu bölümde Java'nın antitezi olsa da (mixin ile dinamik ördek yazma, sınıfları yeniden açma ve diğerleri) yapmadılar.

Hangi $value <> 0 || length($value)>0 || defined($value)doğruluk için kullanılan bir Perl programcısı için şaşırtıcı olabilir . Ve bunun gibi.

nullNe olursa olsun, herhangi bir ifadenin içinde otomatik olarak onu yanlış yapan kuralına göre SQL'i girin . Yani (null==null) = false. Ruby'de (nil==nil) = true. Mutlu zamanlar


Aslında, ((int)3) * ((float)2.5)Java'da oldukça iyi tanımlanmıştır (öyle 7.5f).
Paŭlo Ebermann

Haklısın, @ PaŭloEbermann, bu örneği sildim.
AnoE

Oradaki Woah ... seçmenlerin ve aslında cevabı silmek için oy verenlerin yorumlarını takdir edecektir.
AnoE

Dan Aslında dönüşüm intiçin floatde genel olarak bilgi kaybeder. Java da bu tür dolaylı alevleri yasaklar mı?
Ruslan,

@Ruslan no (uzun süredir aynı → iki katı) - Sanırım buradaki potansiyel bilgi kaybının sadece en az önemli yerlerde olduğu ve sadece çok önemli olmadığı düşünülen durumlarda (oldukça büyük tamsayı değerler) olduğu sanıyorum.
Paŭlo Ebermann

1

Diğer iyi cevaplara ek olarak, diller arasındaki tutarlılık hakkında da konuşmak istiyorum.

Matematiksel olarak saf bir if ifadesi düşündüğümüzde, koşulun doğru veya yanlış olabileceğini, başka bir değerin olmadığını anlıyoruz. Her büyük programlama dili bu matematiksel ideale saygı duyar; bir if deyimine bir Boole doğru / yanlış değeri verirseniz, her zaman tutarlı ve sezgisel davranışlar görmeyi bekleyebilirsiniz.

Çok uzak çok iyi. Java'nın uyguladığı ve yalnızca Java'nın uyguladığı şey budur.

Diğer diller Boolean olmayan değerler için kolaylıklar sağlamaya çalışır. Örneğin:

  • Diyelim ki nbir tamsayı. Şimdi if (n)kısayol olarak tanımlayın if (n != 0).
  • Diyelim ki xkayan nokta sayısı. Şimdi if (x)kısayol olarak tanımlayın if (x != 0 && !isNaN(x)).
  • Diyelim ki pbir işaretçi türü. Şimdi if (p)kısayol olarak tanımlayın if (p != null).
  • Diyelim ki sbir dize türüdür. Şimdi if (s)olmayı tanımla if (s != null && s != "").
  • Diyelim ki abir dizi türüdür. Şimdi if (a)olmayı tanımla if (a != null && a.length > 0).

Kısaca if-test sağlama fikri yüzeyde iyi gözükür… siz de tasarım ve görüşlerdeki farklılıkları bulana kadar:

  • if (0)C, Python, JavaScript'te yanlış olarak değerlendirilir; ancak Ruby'de doğru olarak kabul edildi.
  • if ([]) Python'da false olarak kabul edilir, ancak JavaScript'te doğrudur.

Her dilin ifadeleri bir şekilde veya başka bir şekilde ele almak için kendine özgü nedenleri vardır. (Örneğin, Ruby'deki tek sahte değerler falseve nildolayısıyla 0truthy'dir.)

Java, sizi bir if ifadesine bir Boole değeri sağlamaya zorlamak için açık bir tasarım benimsemiştir. Acilen C / Ruby / Python'dan Java'ya kod çevirirseniz, testlerde değişiklik olmazsa herhangi bir gevşek bırakamazsınız; şartı açıkça Java ile yazmanız gerekir. Duraklatmak ve düşünmek için bir dakikanızı ayırmak sizi özensiz hatalardan kurtarabilir.


1
Bunun x != 0aynı olduğunu biliyor musunuz x != 0 && !isNaN(x)? Ayrıca, s != nullişaretçiler için normaldir, ancak işaretçiler için olmayan başka bir şey.
Deduplicator

@Deduplicator hangi dilde aynıdır?
Paŭlo Ebermann

1
IEEE754 kullanarak, NaN ≠ 0. NaN ≠ herhangi bir şey. Öyleyse, (x) de çalışırsa ve (! X) de
çalışırsa

0

Eh, C, pointer, boolean (C99’dan beri), sayı (kayan nokta veya değil) ve numaralandırma (sayılarla doğrudan eşleme nedeniyle) her skaler türü "doğal" bir falsey değerine sahiptir, bu nedenle herhangi bir koşullu ifade için bu yeterlidir .

Java da bunlara sahiptir (Java işaretçileri referans olarak adlandırılsa ve çok kısıtlı olsa bile), ancak Java 5.0'a suları kabul edilemez bir şekilde karıştıran otomatik boks uyguladı. Ayrıca, Java programcıları daha fazla yazmanın gerçek değerini gösterir.

Koşullu ifadelerin boolean tipine sınırlandırılıp sınırlandırılmayacağına dair tartışmayı doğuran tek hata , şartlı ifadeler türünün hiç bir şekilde sınırlandırılmasıyla değil , çıplak bir atama ifadesinin kullanımının engellenmesiyle ele alınan , bir karşılaştırmanın amaçlandığı bir ödev yazma yazım hatasıdır . değeri için.

Herhangi bir modern C veya C ++ derleyicisi kolayca idare edilir, istenirse sorgulanabilir yapılar için bir uyarı veya hata verir.
Tam olarak amaçlandığı şeyin olduğu durumlarda parantez eklemek yardımcı olur.

Özetlemek gerekirse, boolean ile sınırlama (ve Java'daki kutulu eşdeğeri), =derleme hataları atama seçiminin neden olduğu bir sınıf yazım hatası yapma girişimi gibi görünüyor .


Kullanılması ==İlki değişken (ki o zamana kadar typo'ed olabilir olduğu boolean işlenen ile =) bir iç ifdiğer türleri ile çok daha az sık olur bu sadece bir yarı başarısız girişimi bu yüzden, ben söyleyebilirim.
Paŭlo Ebermann

0.0 -> yanlış ve 0.0 -> true dışında herhangi bir değere sahip olmak bana hiç "doğal" görünmüyor.
gnasher729

@ PaŭloEbermann: Talihsiz yan etkilerle kısmi sonuç, yan etki olmadan hedefe ulaşmak için kolay bir yol varken, kitabımdaki açık bir başarısızlık.
Deduplicator

Diğer nedenleri özlüyorsun. Ne bir truthy değeri hakkında "", (Object) "", 0.0, -0.0, NaN, boş diziler ve Boolean.FALSE? Özellikle sonuncusu komiktir, çünkü yanlış olanı açan kutucuklar boş (true) değildir. +++ Ayrıca yazmaktan nefret ediyorum if (o != null), ama her gün bana birkaç karakter kazandırmak ve yarım günümü "zeki" ifademe ayıklamak için harcamama izin vermem iyi bir şey değil. Bununla birlikte, Java için bir orta yol görmeyi çok isterdim: Daha cömert kurallar ama hiç belirsizlik bırakmadan.
maaartinus

@maaartinus: Dediğim gibi, Java 5.0'daki otomatik kutunun açılmasının tanıtılması, işaretçilere boşluğa karşılık gelen bir doğruluk değeri verdiklerinde, oldukça büyük bir sorun yaşayacakları anlamına geliyordu. Ama bu otomatik- (un-) boksta bir sorun, başka bir şey değil. C gibi otomatik- (un-) boks yapmadan bir dil mutlu bir şekilde özgürdür.
Deduplicator

-1

Benim sorum kötü kodlama tarzı ile ilgili değil. Kötü olduğunu biliyorum, ama neden C'nin izin verdiğine ve java'nın izin vermediğine karışıyorum.

Java'nın tasarım hedeflerinden ikisi:

  1. Geliştiricinin işletme sorununa odaklanmasına izin verin. İşleri daha basit ve daha az hataya açık hale getirin, örneğin çöp toplama, böylece geliştiricilerin bellek sızıntılarına odaklanmaları gerekmez.

  2. Platformlar arasında taşınabilir , örneğin herhangi bir CPU'lu herhangi bir bilgisayarda çalıştırın.

İfade olarak atamanın kullanımının yazım hataları nedeniyle çok fazla hataya yol açtığı biliniyordu, bu nedenle yukarıdaki # 1 hedefi altında, kullanmaya çalıştığınız şekilde izin verilmiyor.

Ayrıca, sıfır olmayan bir değer = doğru ve sıfır değer = yanlış olanın mutlaka taşınabilir olmadığına (evet, ister inanın ister inanmayın, bazı sistemler 0 doğru ve 1 yanlış olarak değerlendirilir ), bu nedenle yukarıdaki 2 numaralı hedefe göre izin verilmez. . Tabii ki hala açıkça oyuncu seçimi yapabilirsiniz.


4
Java 8’de eklenmemişse, sayısal türlerle Boolean’lar arasında net bir işlem yoktur. Sayısal bir değeri bir Boole'ye dönüştürmek için bir karşılaştırma işleci kullanmanız gerekir; Boolean değerini sayısal bir değere dönüştürmek için genellikle üçlü işlecini kullanırsınız.
Peter Taylor

Bu yazım hataları nedeniyle değeri için bir ödevin kullanılmasına izin vermemek için bir dava açabilirsiniz. Ancak Java'da ne sıklıkta == doğru ve == yanlış gördüğünüz göz önüne alındığında, açıkça kontrol ifadesini (isteğe bağlı olarak kutulu) boole türüyle sınırlamak çok yardımcı olmaz.
Deduplicator

Java, taşınabilirliği, Java'nın sıfır ve Java'nın yanlış olduğu gibi "bazı sistemler 0 değerini doğru ve 1 değerini yanlış" olarak değerlendirmesini sağlar. İşletim sisteminin bu konuda ne düşündüğü önemli değil.
maaartinus

-1

Örnek olarak diğer dillerin neler yaptıkları: Swift, "BooleanType" protokolünü destekleyen bir tür ifade gerektirir; bu, "boolValue" yöntemine sahip olması gerektiği anlamına gelir. "Bool" tipi açıkça bu protokolü destekler ve onu destekleyen kendi türlerinizi oluşturabilirsiniz. Tam sayı türleri bu protokolü desteklemiyor.

Dilin eski sürümlerinde isteğe bağlı türler "BooleanType" ı destekledi, böylece "if x! = Nil" yerine "if x" yazabilirsiniz. Çok çok kafa karıştırıcı bir "İsteğe bağlı bool" kullanılarak yapılan. İsteğe bağlı bir bool nil, false veya true değerlerine sahiptir ve "eğer b" sıfır ise "b" yapılmaz, b ise doğru veya yanlış ise çalıştırılır. Buna artık izin verilmiyor.

Ve ufkunu açmaktan gerçekten hoşlanmayan bir adam varmış gibi görünüyor ...

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.