Operasyon "false < true" iyi tanımlanmış mı?
C belirtimi tanımlar:
- varlığını 'az' boolean parametre için operatör, ve eğer öyleyse,
- 4 parametre permütasyon sonucu?
Diğer bir deyişle, aşağıdaki işlemleri belirtimi tarafından tanımlanan sonuçların?
false < false
false < true
true < false
true < true
Benim kurulum (Otomotiv-7, gcc 4.8.2) , kodu ne beklediğiniz altında (0 olarak yanlış ve 1 doğru temsil eden C geçmişini göz önüne alırsak) tükürür:
false < false = false
false < true = true
true < false = false
true < true = false
Eminim çoğu (hepsi?) olmama rağmen Derleyiciler aynı çıktıyı verecektir, bu C belirtimi oluşturmaktadır? Ya kafamı allak bullak, ama belirtimi uyumlu bir derleyici doğru az yanlış olduğuna karar vermek için izin verilir?
#include <iostream>
const char * s(bool a)
{
return (a ? "true" : "false");
}
void test(bool a, bool b)
{
std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}
int main(int argc, char* argv[])
{
test(false, false);
test(false, true);
test(true, false);
test(true, true);
return 0;
}
CEVAP
TL;DR:
İşlemleri de taslak C standardına göre tanımlanmıştır.
Ayrıntılar
9* *draft C standard bölümüne girerek görebilirsinizİlişkisel operatörlerdiyor ki (vurgu ileriye dönük benim):
işlenen aritmetik sahip olacaktırnumaralandırma veya işaretçiyazınya yazın std::nullptr_t. Operatörler &; (daha önce), ^ lt . (daha fazla), <= (eşit veya daha az), ve >= (büyüktür ya da eşittir) tüm verim yanlış veya doğru. Sonuç türü bool
ve bools 3.9.1 Temel türlerinden arithematic türleri vardır
Türleriboolchar, char16_t, char32_t, wchar_t, imzalı ve imzasız tamsayı türleri toplu olarak integral türleri denir.
ve
İntegral ve değişken türleri topluca aritmetik denir türleri.
true
false
2.14.6
Boolean sabitleri gelen boolean sabitleri
boolean-literal:
false
true
Geri 5.9
ilişkisel operatörler mekaniği daha fazla görmek bölüm olacak, diyor
Her zamanki aritmetik dönüşümler aritmetik veya numaralandırma türünü işlenen yapılmaktadır.
her zamanki aritmetik dönüşümleriolan bölümde diyor ki 5
:
Aksi takdirde, integral promosyonlar (4.5) her iki işlenen üzerinde yapılır
ve Bölüm 4.5
diyor ki:
Bool türü bir prvalue int türünde bir prvalue dönüştürülebilir, yanlış olma sıfır ve gerçek bir olmak.
ve benzeri ifadeler:
false < false
false < true
true < false
true < true
bu kurallar haline kullanarak:
0 < 0
0 < 1
1 < 0
1 < 1
Neden "not(True) [False] Doğru mu...
Dize "true" ve "false&q...
Convert&; 0" quot; ve " nasıl;...
Geçersiz geri gönderme veya geri arama...
ValidateRequest="false"'...