Herhangi bir C ++ derleyicisi için (bool) true == (int) 1 varsayabilir miyim?


118

(bool)true == (int)1Herhangi bir C ++ derleyicisini varsayabilir miyim ?


3
Sorunuzdaki yayınlar gereksiz, tersine çevrilmeli mi?
GManNickG

9
Onları oyuncu olarak kastetmiyor, demek istiyorbool t = true; int n = 1; if (t == n) {...} ;
egrunin

7
@egrunin: Eh, ama doğru bir bool ve 1 yine de bir int. :)
GManNickG

1
Doğru, değerlerin türünü belirtmek istedim.
Petruza

2
(int) trueolan 1bir tamsayı değeri olarak, ama bir şey olarak if (pointer)o zaman bir parçası geçer pointer != 0. Doğru olduğunu varsayabileceğiniz tek şey false == 0, ve true != 0(ve atıldığında truedeğerlendirilir )1int
Luis Colorado

Yanıtlar:


134

Evet. Yayınlar gereksiz. İfadende:

true == 1

Bütünsel promosyon geçerlidir ve bool değeri bir değerine yükseltilir intve bu promosyon 1 vermelidir.

Referans: 4.7 [dönş. İntegral] / 4: Kaynak türü bool... truebire dönüştürülürse.


9
@Joshua: truedil tarafından tanımlanan bir anahtar kelimedir. Bir kütüphane tarafından yeniden tanımlanamaz. #define’lerin anahtar kelimeleri yeniden tanımlamasına izin verilmez.
jalf

21
@jalf: # tanımlıların sistem anahtar kelimelerini tanımlamasına gerçekten izin verilir. C derlemesinin ön işleme aşaması tamamen metinseldir ve genel olarak anahtar kelimeler veya C sözdizimi hakkında hiçbir şey bilmez. Yine de, elbette, dil anahtar kelimelerini yeniden tanımlamak neredeyse her zaman kötü bir fikirdir.
Dale Hagglund

2
@jalf. Onlar değil? Bkz gcc.gnu.org/onlinedocs/cpp/Macros.html ve bir kez sorulan Uluslararası Gizlenmiş C Kod Yarışması, girişlerin en az birinde "Ne zaman bir yok whilebir süre alabilir ki?" (Cevap: iki parametre aldığında, çünkü o zaman bu girişin #definedolması gerekiyordu printf.)
Ken Bloom

3
C99, §6.10.1 / 1 şöyle diyor: "Koşullu dahil etmeyi kontrol eden ifade bir tamsayı sabit ifade olmalıdır, ancak şunlar haricinde: bir çevrim içermemelidir; tanımlayıcılar (anahtar kelimelerle sözcüksel olarak aynı olanlar dahil) aşağıda açıklandığı gibi yorumlanır;" Doğrudan izin olarak belirtilmemesine rağmen, bu açıkça bir anahtar kelimeyle "sözcüksel olarak özdeş" olan bir makro olasılığını tasarlar.
Jerry Coffin

2
Oh, ve #defines anahtar kelimeleri yeniden tanımlayabilir. C ++ 1x, yeni anahtar kelimeleriyle çok fazla soruna neden oldu, bu nedenle gereksinimin kaldırılması gerekiyordu.
Joshua

18

Charles Bailey'nin cevabı doğru. C ++ standardının tam ifadesi (§4.7 / 4): "Kaynak türü bool ise, false değeri sıfıra ve true değeri bire dönüştürülür."

Düzenleme: Referansı da eklediğini görüyorum - eğer dikkatim dağılmaz ve unutmazsam kısa bir süre sonra bunu sileceğim ...

Edit2: Daha sonra, Boolean değerlerinin kendileri her zaman sıfıra veya bire dönüşürken, bir dizi işlevin (özellikle C standart kitaplığından) "temelde Boole" olan, ancak ints olarak gösterilen değerleri döndürdüğünü muhtemelen belirtmek gerekir. normalde yalnızca yanlış veya doğru belirtmek için sıfır olmadığını belirtmek için sıfır olması gerekir. Örneğin, is * işlevleri <ctype.h>yalnızca sıfır veya sıfırdan farklı olmayı gerektirir, mutlaka sıfır veya bir değildir.

Bunu çevirirseniz bool, sıfır yanlışa ve sıfır olmayan doğruya (beklediğiniz gibi) dönüşür.


9

Standarda göre, bu varsayımla güvende olmalısınız. C ++ booltürünün iki değeri vardır trueve falsebunlara karşılık gelen değerler 1 ve 0'dır.

Dikkat edilmesi gereken şey, boolifadeleri ve değişkenleri ifade ve değişkenlerle karıştırmaktır BOOL. İkinci olarak tanımlanır FALSE = 0ve TRUE != FALSEoldukça sık uygulama vasıtalarının 0 ile herhangi bir değer farklı kabul edilir olan TRUE.

Modern derleyici bir sürü aslında dolaylı gelen döküm çalışır herhangi kodu için bir uyarı verecektir BOOLiçin boolise BOOLdeğeri 0 veya 1 den farklıdır.


3

Doğru üzerinde farklı derleyicilerin farklı sonuçlar döndürdüğünü gördüm. Ayrıca, bir int yerine bool ile bool'u karşılaştırmanın neredeyse her zaman daha iyi olduğunu buldum. Programınız geliştikçe bu ints değer değiştirme eğilimindedir ve 1 olarak doğruyu varsayarsanız, kodunuzun başka bir yerinde ilgisiz bir değişiklikle ısırılabilirsiniz.


3
Bu, truetanımlanmış davranışa sahip bir dil anahtar sözcüğü gibi C ++ için yanlış bir yanıttır . Gibi yaygın olarak tanımlanmış bir makroya başvurursanız TRUE, bu doğrudur.
David Thornley

1
Benim deneyimim C derleyicileriyle olabilirdi - onlarla yıllar boyunca bolca zaman geçirdim. Matematiksel ifadeleri doğrudan kullanmakla ilgili fikrim eğer ifadeler geçerliyse. Bir if'de bir bit kaymasının sıfırdan farklı olup olmadığını gören bir kodumuz vardı, o zaman başka biri aynı sıfır olmayan değeri aldı ve 1 olduğunu varsaydı ve her şeyi havaya uçurdu. Doğru / 1'e basit bir dönüşüm bunu engelleyebilirdi.
Michael Dorgan

Ben de bu tür davranışlar gördüm. Kuşkusuz bunu en son 1999'da gördüm. GCC kullanıyordum. Dil C idi. Yine de, gerçekten böyle bir davranış gördüm.
thb
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.