İ, j = 1 gerçekten yanıltıcı mı? [kapalı]


11

Bir astarda çok değişkenli başlatma hakkında ortak bir argüman vardır, yani:

Örneğin int i, j = 1; bazı insanları her iki değişkenin de başlatıldığına

Birisinin, dilinin sözdizimini bu konuda yanılmamak için yeterince bilmesi gerektiğini iddia edebiliriz. Başka bir argüman, geliştiriciler olarak, birçok dil öğrendikçe, diller arasındaki özellikler arasında hatalar yapabileceğimiz olabilir.

Ancak bu çok özel durum için merak ediyorum ben bile çok sözdizimi i, j = 1 her iki değişken başlatmak nerede bir dil var mı?

Değilse, bu argüman geçerli değildir.


2
Diliniz aklı başındaysa, başlatılmamış bir değişkene erişmek bir derleyici hatasını tetiklediğinden potansiyel karışıklık zararsızdır.
CodesInChaos

4
@CodesInChaos, C'nin aklı başında olmadığını mı söylüyorsun?
Baldrickk

2
Bir dilin bir şeye izin vermesi, insanların gereksiz acıya neden olmadığınız anlamına gelmez. Bu kodun çağrıldığı tek yer, dil özelliklerini ezberlememiş olanları cezalandırmak için tasarlanmış sınavlar sırasındadır. Her zaman bu tür sorularda başarısız oldum. Bleh.
candied_orange

2
Visual Basic 6'da Dim Apple, Orange, Pear as Fruityasal bir bildirimdir. VB bilmediğinizi varsayalım. İlk izleniminiz Appletürden Fruitmi? O değil. Unutmayın, diller genellikle bu dilde uzman olmayan kişiler tarafından okunur; uzmansanız, niyetinizi uzman olmayanlara bile net bir şekilde iletmek için dili akıllıca kullanın. Hiçbir dilde çoklu başlatma kullanmam.
Eric Lippert

13
Benzer şekilde: düşünmek var x = 1, y = 1.5; Bu aynı mı int x = 1; double y = 1.5;yoksa aynı double x = 1, y = 1.5;mı? varC # 3.0'a eklediğimizde bir anket yaptım ve insanların yaklaşık yarısının ilkinin "açık" doğru olduğuna ve diğer yarısının diğerinin "açık" doğru olduğuna inandığını keşfettik ve yasadışı hale getirdik. Nüfusun yarısını yanlış yönlendiren bir özellik kötü bir özelliktir.
Eric Lippert

Yanıtlar:


37

Bence değil, ama mesele bu değil. Nokta olduğunu i, j = 0çok kolay yanlış içindir i = j = 0, hangi yapar hem ilklendir. Netlik, kaynak kodunun doğruluğun yanındaki en önemli gereksinimidir ve bu sorunun ortaya çıkması bile netliğin yetersiz olduğunu kanıtlamaktadır.


3
Ben de böyle bir açıklama yoksa iddia ediyorum değil hem ifadeleri başlatmak, neden bile vardır?
Berin Loritsch

2
@BerinLoritsch dile bağlıdır. Bu, bildirim kaldırma nedeniyle sık sık JavaScript'te yapılır: kodda kullanıldıkları noktaya kadar başlatmasanız bile, değişkenlerin mevcut oldukları kapsamın üstünde bildirilmesi en iyi uygulama olarak kabul edilir. . Hemen hemen tüm kod dönüştürme araçları bu şekilde çıktılanır.
Jared Smith

1
Bir kod çıkış aracı bunu yaptım eğer bir şey varsayalım, çünkü bu güvenilir olması gerekiyordu. Bununla birlikte, insanlar için, son elementin beyanını ve başlatılmasını sadece bir satırda birleştirmesini öneriyorum. Sadece gerçekleşmeyi bekleyen bir böcek gibi görünüyor.
Berin Loritsch

2
@JaredSmith Maple'ın yanı sıra, şu anda istenen bir dil düşünemiyorum, C bile artık kapsama daha yakın (C ++ ve yarı iyi statik derleyicileri olan diğer diller gibi) tercih ediyor çünkü potansiyel hataları durdurma ve izin verme avantajı sağlıyor derleyici, işlevsellik değişmediği sürece değişkenle ne yapılacağına karar vererek, daha az kayıtla kurtulabileceğiniz göz önüne alındığında, potansiyel olarak daha iyi optimizasyonlara izin verir.
whn

6
Dil ne olursa olsun, " Yazmaya karşı (ya da daha iyisi ayrı satırlara karşı) faydası nedir ?" int i, j=1int i; int j = 1
chepner

2

Bence, her iki taraf için de tartışabilirsiniz:

  • Kontra i, j = 0:
    Matematikçiler hem anlamına için kullanabilir yapmak ive jsıfır olması gerekiyordu.

  • Pro i, j = 0:
    Operatörlerinizin önceliğini bilmek basit bir mesele. Öncelikleri hakkında şüpheniz varsa, şimdi aramanın zamanı geldi.

    a.b += c[i]*d[i];Parantez olmadan bir şeyler yazmamızın nedeni de aynı . Tabii ki bu eşdeğerdir (a.b) += ((c[i])*(d[i]));, ancak programcıların en çok kullanılan operatörlerin önceliğini ezbere bilmesi ve emin olmadığında operatörlerin önceliğine bakabilmeleri beklenebilir. Bu nedenle, parantezler, operatörün önceliğinin öngördüğünden farklı bir değerlendirme sırası zorlamadıkça genellikle işe yaramaz dağınıklık olarak kabul edilir.

    Tabii ki, istisnalar var. Her iki durumda da parantezin feragat edilmesi önceliği <<ve +genellikle belirsiz olduğu düşünülmektedir. Ancak bu, kuralı ispatlayan bir istisnadır.

Birincisi, Pro tarafına daha fazla düşecektim, ancak bu bildirimleri yasaklayan herhangi bir stil kılavuzuna bağlı kalmaya hazırım. Bu sadece savaşmaya değer bir mesele değil.


7
Ben dikkat int i, j = 0;hayır vardır operatörleri içinde. Sadece ifadesi şu şekilde açıklamada ise 0ve bu nedenle operatör önceliği içine gelmiyor. Ayrıştırıcı ,, virgül operatörü veya =atama operatörü olarak işlem yapmaz ; daha ziyade, bunlar beyan ifadesinin dilbilgisel bölümleridir.
Eric Lippert

@EricLippert Öncelik kuralları söz konusu olduğunda, bu fark önemsizdir: Bildiğim herhangi bir C tarzı dil, bir bildirimde diğer ifadelerde olduğu gibi aynı öncelikleri kullanır. Başka her şey felaketi davet ederdi.
cmaster

but programmers can be expected to know the precedence of the most used operators by heart, diyorsun. Verdiğiniz örnekte, çoğu (ortalama) programcının üye erişim operatörünü veya dizi endeksi operatörünü matematiksel anlamda operatör olarak algıladığından emin değilim, ancak onları daha çok doğal dil isimleri ve çarpma olarak düşünün fiil olarak operatör. Bu yüzden int i, j, k = 0;böyle şeytani bir yapıdır, çünkü "int değişkenleri i, j ve k" nın doğal dil analogu olarak bildirilir ve 0'a ayarlanmalıdır "!
Steve

@Steve Bir programcı olarak öncelik kurallarını nasıl hatırladığınız tamamen size bağlıdır. Onları dilin isimleri olarak düşünmenize yardımcı olursa, yapın. Ancak, bu gibi şeyleri gördüğünüzde sorunla karşılaşacaksınız *a[i], bunu "isimler" benzetmesi ile yeterince ayrıştırabileceğinizi sanmıyorum. Gelince int i, j, k = 0;sen kurallarına bakmak yoksa, o her anlama gelebilir: Üçüncü yorumlama açıklamadan olacaktır int i, daha sonra değerlendirmek jve son olarak atamak k = 0. Dilinizin sözdizimini bilmiyorsanız, bu tür yapıları ayrıştıramazsınız. Yine de yaparsan bu senin sorunun.
cmaster

@cmaster, özel ezberleme stratejimi ifade etmiyordum haha. Ben bir C programcısı değilim, bu yüzden C'deki operatör önceliğine aşinam ikinci sınıf. Ancak örneğinize baktığımda not ettiğim şey, çarpma operatörünün dizi indeksi operatörüne göreceli bir önceliğe sahip olduğunu bile düşünmüyorum. Yani, a[i]uygulanan bir indeks operatörü olarak okumadım a, daha çok ikisini birlikte çarpma operatörünün işlenmesini belirten indirgenemez bir sözdizimsel eleman olarak okudum ve bu yüzden önceliği değerlendirmem bile istenmedi. (1/2)
Steve
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.