C ++ 'daki boolean türü neden ++ destekliyor?


29

Operatör --, bool için mevcut değil , operatör için mevcut değil ++mi?

C ++ 'da denedim ve sorumun başka bir dile uygulanıp uygulanmadığını bilmiyorum. Ben de bildiğim için memnun olacağım.

Biliyorum , operatörü ++bir bool ile kullanabilirim . Herhangi bir bool'u gerçeğe eşit yapar.

bool b = false;
b++;
// Now b == true.

Operatörü neden --ters şekilde kullanamıyoruz ?

bool b = true;
b--;
// Now b == false;

Çok kullanışlı değil ama merak ediyorum.


8
StackOverflow'taki bu soru aydınlatıcı olabilir.
Blrfl

Yani tarihin nedeni. Bağlantı için teşekkürler. Bir cevap yazabilir misin ve çözülmüş olarak koyarım?
aloisdg diyor ki

Bağlantılar tek başına iyi cevaplar vermez ve tnis sorusunu başka bir SE sitesindeki bir kopyasını işaretlemek için iyi bir mekanizma yoktur.
Blrfl

1
Bu yüzden meta.stackexchange.com veya başka bir konuda bir konu açmalıyız. Bence iyi bağlantı için bir karma edinmelisin ve eğer birileri sizi affederse, orijinal cevabın yazarı biraz karma almalı. Aslında, asıl soru da biraz karma almalı.
aloisdg diyor 23: 46'da Monica

2
@ Aloisdg çapraz site dupo MSO üzerinde eski bir konudur . Chase bağlantılı soruları bunun bir dolgun görünüm elde etmek.

Yanıtlar:


53

C'nin eski günlerinde, boole türü yoktu. İnsanlar intboolean verileri depolamak için kullandılar ve çoğunlukla işe yaradı. Sıfır yanlıştı ve her şey doğruydu.

Bunun anlamı bir int flag = 0;ve daha sonra aldıysanız flag++değeri doğru olurdu. Bu, bayrağın değeri ne olursa olsun işe yarayacaktı (çok fazla yapmadıysanız, devrildi ve sıfıra geri döndünüz, ancak bunu görmezden gelelim) - bayrağını değeri 1 olduğunda artırarak 2'yi verdi. doğru.

Bazı insanlar bunu koşulsuz olarak bir boole değeri true olarak ayarlamak için kullandılar. Aptalca bir hale geldiğinden emin değilim , ama bazı kodlar içinde.

Bu asla işe yaramadı --, çünkü değer 1'den başka bir şey olsaydı (ki olabilirdi), değer hala yanlış olmazdı. Ve eğer zaten yanlıştıysa ( 0) ve üzerinde bir azaltma operatörü yapmış olsaydınız, yanlış olmazdı.

İlk günlerde C kodunu C ++ 'a taşırken, C ++' da bulunan C kodunun hala çalışabilmesi çok önemliydi. Ve böylece C ++ şartnamesinde (bölüm 5.2.6 (sayfa 71)) okur:

Bir postfix ++ uygulanarak elde edilen değer, operandın operatörü uygulamadan önce sahip olduğu değerdir. [Not: Elde edilen değer orijinal değerin bir kopyasıdır] Operand değiştirilebilir bir değer olacaktır. İşlenenin türü aritmetik bir tür veya tam bir nesne türüne bir gösterici olacaktır. Sonuç belirtildikten sonra, nesne türü bool, nesne türü olmadığı sürece, 1'e eklenerek değiştirilir , bu durumda true olarak ayarlanır. [Not: bu kullanım kullanımdan kaldırılmıştır, bakınız Ek D]

Sonek işleneni - işlenenin türünde olmaması dışında, sonek ++ işlecine benzer şekilde azaltılır bool.

Bu yine bölüm 5.3.2'de belirtilmiştir (önek operatörü için - 5.2.6 posta ekinde idi)

Gördüğünüz gibi, bu kullanımdan kaldırılmıştır (belgede Ek D, Sayfa 709) ve kullanılmamalıdır.

Ama bu yüzden. Ve bazen kodu görebilirsiniz. Ama yapma.


5
"Bazı insanlar bunu koşulsuz olarak bir boole değeri true olarak ayarlamak için kullandı." Onlara lanet aptal diyelim, insanlara değil.
Deduplicator

@Deduplicator: Belki de bu bir performans meselesiydi: bir değişkene bir değer yüklemek, değişkeni arttırmaktan daha fazla işlemci döngüsü almış olabilir. Tabii ki, bu muhtemelen modern bilgisayarlarda önemli değil.
Giorgio

1
@Giorgio bu oldukça muhtemel. C'nin PDP-7 komut setiyle yakından eşleşmesi için yazıldığını ve PDP-11'in başka ayarlamalar yaptığını unutmayın. Gönderen bu - "İnsanlar genellikle Aralık PDP-11 C ve Unix ilk popüler oldu hangi tarafından sağlanan otomatik artış ve otomatik eksiltme adresi modlarını kullanmak için yaratılmıştır tahmin Bu tarihsel olarak mümkün değildir, hiçbir PDP- yoktu çünkü. Ancak, B geliştirildiğinde, PDP-7, dolaylı bir hafıza referansının hücreyi arttırdığı özelliğiyle, birkaç “otomatik artış” hafıza hücresine sahipti.

@Deduplicator: Booleans için tamsayı kullanan kodda, her biri için artımlı olan bir değişken ... ne olursa olsun ... hem bir sayaç (ne kadar arttırıldıysa) hem de bir boole olarak hareket edebilir (hiç arttırılmış veya değil).
Keith Thompson,


1

Bu sorunun tarihsel önemini anlamak için Therac-25'in durumunu düşünmelisiniz. Therac-25, kanser hastalarına radyasyon ileten tıbbi bir cihazdı. Kötü güvenlik kaydına katkıda bulunan kötü programlama uygulamaları ile uğraştı (birçok ölümle ilişkilendirildi).

http://courses.cs.vt.edu/professionalism/Therac_25/Therac_1.html

(sayfa 3'ün altına gidin)

Set-Up Test rutini içerisindeki her bir geçiş, Class3 adlı paylaşılan bir değişken olan üst kolimatör pozisyon kontrolünü artırır. Class3 sıfır değilse, bir tutarsızlık vardır ve tedavi devam etmemelidir. Class3 için sıfır değer, ilgili parametrelerin işlemle tutarlı olduğunu ve kirişin engellenmediğini gösterir.

...

Makine kurulumu sırasında, Ayarlama Testi, diğer olayların gerçekleşmesini bekleyerek yeniden planladığı için yüzlerce kez gerçekleştirilecektir. Kodda, Class3 değişkeni Kurulum Testinde her geçişte bir artırılır. Class3 değişkeni 1 bayt olduğundan, yalnızca en fazla 255 ondalık değer içerebilir. Böylece, Ayar Testi kodunda her 256. geçişte, değişken taşar ve sıfır değerine sahiptir. Bu, Kurulum Testinden her 256 geçişte bir üst kolimatörün kontrol edilmeyeceği ve bir üst kolimatör hatasının tespit edilmeyeceği anlamına gelir. Aşırı maruz kalma, operatör Class3'ün sıfıra döndüğü tam anda "set" düğmesine bastığında meydana geldi. Bu nedenle Chkcol uygulanmadı ve üst kolimatörün hala alan ışığı konumunda olduğunu belirtmek için F $ mal ayarlanmadı. Yazılım, hedef yerinde ve tarama olmadan tam 25 MeV'yi açtı. Yüksek konsantrasyonlu bir elektron ışını ortaya çıktı ve yoldaki paslanmaz çelik ayna tarafından dağıldı ve yön değiştirdi.

Eşdeğer gibi Therac-25 kullanılan bir şey operator++bir üstünde bool. Ancak, kullandıkları programlama dili C ++ değildi ve veri tipleri değildi bool. Bununla birlikte, C ++ garantisinin aksine, normal bir tamsayı türü basitçe devam eder. Onların veri türü eşdeğerdi uint8_t.

C ++ operator++bu gibi programlamaya alışkın insanlar için etrafta kalmaya karar verdi , ancak değeri arttırmak yerine, bunun truegibi şeyleri önlemeye ayarladı .

Bu operator++(bool)kullanımdan kaldırıldığına dikkat edin.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf

C ++ 14 Ek D:

D.1 Bool operandlı artış operatörü
++ operatörü ile bool tipinde bir operand kullanımı, kullanımdan kaldırılmıştır (bkz. 5.3.2 ve 5.2.6).


Bu neden kullanımdan kaldırıldığını açıklasa da, neden en başta var olduğunu açıklamıyor.

Vardır çünkü C'de programlama yaparken değerini artırarak bir boole değeri ayarlayan bazı insanlar vardı bool. İnsanların bu şekilde programlandıkları zamana dair tarihsel bir örnek vermeye çalışıyordum.
David Stone
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.