以前版本的C++;在'if()'语句中计算条件时,是否使用类的'int'运算符? 现代版本的C++在使用< >()( />代码>语句时,尝试使用类的 BoOL 运算符。当不存在bool运算符时,使用其他强制转换运算符,例如int。这一点如下所示 #include <iostream> using namespace std; class TwoInts { public: int a,b; operator bool() { cout << "TwoInts to bool" << endl; return 0;} operator int() { cout << "TwoInts to int" << endl; return 0;} }; class SixInts { public: int a[6]; operator int() { cout << "SixInts to int" << endl; return 0;} }; int main(void) { TwoInts T; SixInts S; if (T) cout << "xxx" << endl; if (S) cout << "xxx" << endl; return 0; } 查看一些旧的C++代码,似乎有一个我想验证的变化。 C++的旧版本在评估< If()> < /C> >语句> 时,使用类的 int < /Cux>运算符>如果有的话,版本是什么?p>
因此,建议的产出应该是以前版本的C++;在'if()'语句中计算条件时,是否使用类的'int'运算符? 现代版本的C++在使用< >()( />代码>语句时,尝试使用类的 BoOL 运算符。当不存在bool运算符时,使用其他强制转换运算符,例如int。这一点如下所示 #include <iostream> using namespace std; class TwoInts { public: int a,b; operator bool() { cout << "TwoInts to bool" << endl; return 0;} operator int() { cout << "TwoInts to int" << endl; return 0;} }; class SixInts { public: int a[6]; operator int() { cout << "SixInts to int" << endl; return 0;} }; int main(void) { TwoInts T; SixInts S; if (T) cout << "xxx" << endl; if (S) cout << "xxx" << endl; return 0; } 查看一些旧的C++代码,似乎有一个我想验证的变化。 C++的旧版本在评估< If()> < /C> >语句> 时,使用类的 int < /Cux>运算符>如果有的话,版本是什么?p>,c++,C++,因此,建议的产出应该是 TwoInts to int SixInts to int 有关问题原因的一些详细信息:转换旧的大整数类的问题可能是由于int与bool在if()中引起的。不再有访问旧编译器的权限,因此无法测试旧行为 [编辑] 使用以下答案和更多研究: 答: >是/强>,许多预ISO标准C++版本(1980年代中期-1998),缺少一个 Boo.,使用了Casto int (或其他数值类型)。存在显著的编译器差异-这是预标准 第一个C++ ISO标准1998(ISO/IEC 1488
TwoInts to int
SixInts to int
有关问题原因的一些详细信息:转换旧的大整数类的问题可能是由于int
与bool
在if()
中引起的。不再有访问旧编译器的权限,因此无法测试旧行为
[编辑]
使用以下答案和更多研究:
答:<强> >是/强>,许多预ISO标准C++版本(1980年代中期-1998),缺少一个<代码> Boo.<代码>,使用了Casto<代码> int <代码>(或其他数值类型)。存在显著的编译器差异-这是预标准
<>第一个C++ ISO标准1998(ISO/IEC 1488~1998年,AKA C++ 98)。它定义了
bool
类型。因此ISO标准C++一直使用<代码>布尔O/C++ > CAST <代码> IF-(<)/代码> .< /P> < P>不在标准C++中。严格来说,在标准C++中,if语句试图将其中包含的表达式转换为<代码>布尔O/COD>,然后基于此改变行为。
ISO/IEC 14882:2003 4.12[conv.bool]/1:
算术、枚举、指针或指向成员类型的指针的右值可以转换为bool类型的右值。零值、空指针值或空成员指针值转换为false;任何其他值都将转换为true
6.4.1[stmt.if]/1:
如果条件(6.4)为真,则执行第一个子语句。如果selection语句的else部分存在并且条件产生false,则执行第二个子语句。在if语句的第二种形式(包括else)中,如果第一个子语句也是if语句,则内部if语句应包含else部分。76)
注意“true”和“false”的明确引用,这是布尔概念。
< P>我不能直接回答这个问题,但是在1990版的C++标准版中没有<代码>布尔O/COD>类型。同样地,
if
不可能使用操作符bool()
,而且在我看来,如果它工作的话,它可能会使用操作符int()
。我没有一份1990 C++参考手册来确认。我们多大年纪了?像C一样,我想C++98之前的一些实现可能完全缺少了bool
类型。有趣的是,知道一些旧代码仍然编译,尽管有一些修改。你引用了什么老C++编译器?代码有多个目标:UNIX/UNIX(AGIS/阿波罗,系统V,HPUX),Windows /DOS和OS9DOS?所以Turbo C++是在编译器列表中的吗?是的,没有<代码>布尔O/COD>。这就解释了为什么代码有if(!!x)
。A操作符的code>代码>@chux:不,这很可能是“安全布尔”习语的结果。@Billy ONeal感谢您的反馈,并对今年的事情表示抱歉。我说“老C++代码”和 C++ >代码>自20世纪80年代以来一直流传,所以“旧”听起来很好,但没有学究式。最初应该建议使用大约一年。对if()
用法的现代规范进行了很好的解释。最相关的部分是6.4/4:作为表达式的条件的值是表达式的值,对于switch
以外的语句,隐式转换为bool
。
TwoInts to int
SixInts to int