Mantıksal operatörlerin yazılı versiyonları


97

Bu şimdiye kadar gördüğüm tek yerdir and, orve notC ++ gerçek operatörler olarak sıraladı. NetBeans'de bir test programı yazdığımda, bir sözdizimi hatası varmış gibi kırmızı alt çizgiyi aldım ve web sitesinin yanlış olduğunu anladım, ancak bu yanlış olan NetBeans, çünkü beklendiği gibi derlendi ve çalıştı.

!Tercih edildiğini görebiliyorum notama and& & nin okunabilirliği orgramer kardeşlerinden daha büyük görünüyor. Mantıksal operatörlerin bu sürümleri neden var ve neden görünüşte kimse onu kullanmıyor? Bu gerçekten geçerli C ++ mı yoksa dile dahil olan C ile bir tür uyumluluk mu?


4
\ beni tüm kodu yeniden yazar
eski durumuna Monica - lmat

2
"temiz kod" ruhu içinde, kişisel olarak yazma alışkanlığından kurtulmanızı tavsiye ederim ||ve &&hatta !bazen bazen. Kelimeler her zaman "satır gürültüsünden" daha iyidir, bit işleme operatörleriyle olası karışıklıktan bahsetmeye bile gerek yok.
Ichthyo

2
@Ichthyo Bu her zaman doğru değildir. Çok sayıda sembolü okumak ve anlamını bilmek çok fazla kelime okumaktan çok daha hızlıdır.
vallentin

Bir insan okuyucu için daha net olan şey "Gestalt" a bağlıdır. Bazen bir sembol, karışık bir terimden daha net olabilir, ancak bu durumda öyle değildir. Ve, İngilizce'nin basit kelimeleri, biraz garip bir programlama dilinin bazı garip özel sembollerinden çok daha evrenseldir ...
Ichthyo

4
Bunun anddaha okunaklı olduğunu söyleyip ardından " and&& or" yazmanın ironisi :)
Ivan Vergiliev

Yanıtlar:


114

Başlıktaki C'de ortaya çıktılar <iso646.h>. Zamanda gerekli simgeleri yazmak olamazdı klavyeler vardı &&(örneğin), başlık içerdiği yüzden #define'o tanımlayan (bizim örneğimizde) tarafından, bunu yaparken onlara yardımcı olacağına s andolmak &&. Elbette zaman geçtikçe bu daha az kullanıldı.

C ++ 'da, alternatif belirteçler olarak bilinen şey haline geldiler . Sen do not (- K başlığının sürümünü ified gibi, C ++ uyumlu derleyicilerde bu belirteçleri kullanmak için bir şey eklemeniz gereken <ciso646>, boştur). Alternatif belirteçler, yazım dışında normal belirteçler gibidir. Yani ayrıştırma sırasında andolduğu tam olarak aynı &&aynı şeyi yazım sadece farklı bir yolu.

Kullanımlarına gelince: Nadiren kullanıldıkları için, onları kullanmak yardımcı olmaktan çok daha şaşırtıcı ve kafa karıştırıcıdır. Eminim normal olsaydı, okuması çok daha kolay olurdu, ama insanlar buna çok alıştı &&ve ||başka her şey dikkat dağıtıcı oluyor.

DÜZENLEME: Ancak bunu yayınladığımdan beri kullanımlarında çok hafif bir artış gördüm. Hala onlardan kaçınıyorum.


Öyleyse bu alternatif belirteçlerin yorumlanması yalnızca bir derleyici özelliği mi yoksa C ++ belirtiminde mi?
defectivehalt

2
@Kavon: Standardın 2.5 bölümünde belirtilmiştir; bu bir dil özelliğidir.
GManNickG

15
Şahsen çok daha iyi olduklarını düşünüyorum ... ama o zaman Python önyargılıyım. Bazılarının neden bozuk değilse kod olmadığını düşündüğünü bilmiyorum ...
Matthieu M.

Yani bunlar, başlık dosyası dahil edilmeden C'de geçerli değil mi? Bunların herkes tarafından kullanılmamasına şaşırdım; Python'u çok daha okunaklı hale getiriyorlar.
endolith

1
En azından Visual Studio 2015 CTP 6, başlığımı dahil etmeden orveya noteklemeden beğenmedi .
usr1234567

19

Kullanılabilirlik (klavye / ekran çeşitlerinde karakter desteği) ve genel okunabilirlik için varlar, ancak günümüzde daha belirgin olan başka bir neden var. Neredeyse cevapların hiçbiri burada , burada , hatta ana cevabı buradaBirçoğumuzun kelime sürümlerini sembol sürümlerine tercih etmesinin temel nedenini (ve diğer dillerin bunları kullanmasının ana nedenini) açıklayın: böcekler. Kelime versiyonları arasındaki farklar oldukça belirgindir. Sembol versiyonları arasındaki farklar belirgin şekilde daha azdır, böcekleri nispeten daha büyük ölçüde cezbedecek derecede: "x | y", "x || y" değildir, ancak çoğumuz daha büyük bir ifadeye gömüldüğünde farkı özledim. Eşitlik operatörüyle eşitlik operatörünün ortak kazara karıştırılmasına benzer. Bu nedenle, kelime versiyonları lehine sembol versiyonlarından vazgeçtim (kolay olmadı). Böcekleri kışkırtmaktansa, eski şeylere olan sevgimiz nedeniyle birinin onları iki kez almasını tercih ederim.


4
Ne yazık ki, Visual Studio'da (VS2013 itibariyle), /Zaalternatif anahtar kelimeleri desteklemek için belirli bir derleyici seçeneği ( ) ayarlamalısınız (bkz. Stackoverflow.com/a/555524/368896 ). Muhtemelen bunun başka etkileri de var. Dolayısıyla, Visual Studio'da bu tavsiyeye uymak her zaman güvenli değildir.
Dan Nissenbaum

FWIW / - operatörlerin etrafına boşluklar koyduğumda, x | ygörsel olarak yeterince farklı (tek aralıklı yazı tiplerinde) x || y, ancak in'i !örneğin if (!f(xyz) && ...gözden kaçırmaktan daha kolay buluyorum if (not f(xyz) && ....
Tony Delroy

@Tony D operatörlerin etrafına boşluklar koyduğunuzda, bu sizin özel konvansiyonunuzdur ve okuyucu için açık değildir. Ama kullanarak doğal dil kelimeleri gibi and, orve notbir boolean ifadede, aslında okunabilirliği artırır artı biraz manipülasyonlara ayrımı vurgular. Bu yüzden IMHO, sevdiğimiz eski alışkanlıklarımızı daha iyi hale
getirmeyi düşünmeliyiz

@DanNissenbaum Bu seçeneği C / C ++> Dil> Dil Uzantılarını Devre Dışı Bırak adı altında buldum , bu nedenle yan etkilerin beklenmesi nispeten güvenli;)
Wolf

6
İnsanların nasıl çalışması gerektiğine dair düşünceleri andve orönyargısı nedeniyle kaç tane Python hatasının ortaya çıktığını biliyor musunuz ? Örneğin if (a == b or c)yerine if (a == b || a == c)- Böyle bir şey hemen hemen her gün burada StackOverflow açılır. İngilizceden kopuk soyut semboller bu hataları azaltır.
Mark Ransom

10

C ++ 'da bunlar gerçek anahtar sözcüklerdir. C'de, makrolar tanımlanmıştır <iso646.h>. Bkz. Http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html .


6
Teknik olarak bunlar anahtar kelimeler değil, alternatif belirteçlerdir. :)
GManNickG

2
@GMan: +1 Güzel arama olsa da, Dinkumware sayfası onlara anahtar kelime diyor, bu yüzden, farkı pek umursamadılar.
Chris Jester-Young


Öyleyse, MSVC onları C ++ 'da kutunun dışında destekliyor ancak C'de değil mi?
ilk

1
@rwst MSVC hakkında özel olarak yorum yapamam, ancak C ++ ve C standartlarını sadakatle uygularsa, o zaman gerçekten durum böyle olacaktır. Ayrıca bkz .: stackoverflow.com/questions/2376448/…
Chris Jester-Young

2

andve &&işlevsel olarak C ++ 'da aynıdır. andVe oroperatörler gerçekten geçerli C ++ ve dil standardının bir parçasıdır.

Diğer cevapları somut bir örnekle detaylandırmak için, sadece "okunabilirlik" den ziyade tercih etmenin başka bir nedeni daha andvar &&. Mantıksal bir AND olduğunda açık bir şekilde "ve" yazmak, ince böcek olasılığını ortadan kaldırır.

Bunu düşün:

int x = 3;
int y = 4;

// Explicitly use "and"
if (x and y) {
    cout << "and: x and y are both non-zero values" << endl;
}

// Using "&&"
if (x && y) {
    cout << "&&: x and y are both non-zero values" << endl;
}

// Oops! I meant to type "&&"!
if (x & y) {
    cout << "&: x and y are both non-zero values" << endl;
}
else {
    cout << "How did I get here?" << endl;
}

Her üç if ifadesi de derlenecek, ancak sonuncusu tamamen farklı ve istenmeyen bir şey anlamına geliyor!

Her zaman andmantıksal AND'yi kastettiğinizde kullanırsanız , asla yanlışlıkla tek bir "&" yazamaz ve kodunuzun başarıyla derlenmesini ve gizemli sonuçlarla çalışmasını sağlayamazsınız.

Bir başka iyi alıştırma: "ve" karakterini yanlışlıkla bırakmayı deneyin ve ne olacağını görün. ;)


1
Bu gerçekten sorunun cevabı değil. Sadece ne hissettiğinin daha okunaklı olduğunu söylüyorsun. OP, hangilerinin daha iyi değil, yazılı sürümlerin nasıl çalıştığını sordu. Ve başka biri zaten senin yapmaya çalıştığın aynı noktayı yaptı.
Nicol Bolas

Gerçekten daha yararlı bilgiler sağladığından değil ama yanıta " andve &&işlevsel olarak aynı" ekleyeceğim ... Ve cevabımı okursanız, bunun okunaklılıkla ilgili DEĞİLDİR dediğimi görürsünüz;)
tjwrona1992
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.