VB6和C++布尔字面量

3
我正在学习C++,我的背景是.NET和VB6。
我对以下网页关于布尔值的内容很感兴趣:http://msdn.microsoft.com/en-us/library/ff381404(v=vs.85).aspx 也就是说,
“尽管有了TRUE的定义,但是大多数返回BOOL类型的函数可以返回任何非零值来表示布尔值为真。因此,您应该总是这样写:”。
// Right way.
BOOL result = SomeFunctionThatReturnsBoolean();
if (result) 
{ 
    ...
}

这也适用于VB6吗,比如说这样写会有问题吗:If BooleanValue = True Then

不幸的是,遵循这个指南往往会引入许多关于从“int”到“bool”的隐式转换的警告。 - Frerich Raabe
相关:VBScript 不是逻辑,作者 Eric Lippert。(在这种情况下,VBScript 和 VB6 之间的差异并不相关。) - Cody Gray
2个回答

8
Windows API旨在用于C程序,而C99之前并没有bool类型,甚至现在也没有完全实现,例如Microsoft编译器从未实现过。因此,他们不得不想出一个解决办法,这个解决办法与C编译器处理逻辑值的方式高度兼容。使用int类型,其中0表示假,任何其他值表示真。因此,建议如下。
VB6有一个专门的布尔类型和字面值True和False的关键字,因此没有完全相同的问题。但是,您仍然可能因为编写不良的COM服务器而遇到麻烦。True的底层整数值为-1,与许多其他语言实现的逻辑布尔类型极不兼容,包括C语言。VB6成为异类的原因很好理解,它的And和Or运算符不区分逻辑和算术运算。通过将True设置为-1,False设置为0,就没有区别了。当COM服务器返回1以表示True而不是VARIANT_TRUE时,可能会出现问题。
但最重要的是,编写If booleanVariable = True Then太丑陋了,对许多程序员来说都像是指甲划过黑板一样难听。只需编写If booleanVariable Then即可搞定。

1
+1,做得好。技术背景的解释也很好。 - Konrad Rudolph
Hans,你能解释一下为什么写成:“If booleanVariable = True Then”很丑吗?另外,如果COM服务器从不返回布尔值的整数,即始终返回字面值即TRUE或FALSE,那么就不应该有问题,对吧?VB6 COM组件仅由VB6客户端使用。谢谢。 - w0051977
1
因为它是多余的。写不需要的代码来使其工作没有任何意义。COM服务器通常用C++编写。它有“真正”的文字,但它的值是错误的,因此出现了问题。如果服务器是用VB6实现的,显然根本没有问题。 - Hans Passant

2
在VB中不行,因为True/False是真正的布尔值。但在C/C++中,BOOL只是int的#define,因此可以将BOOL变量赋予任何整数值(在C中,TRUE是1的#define(通常),FALSE是0的#define)。如果您想要更好地与VB体验重叠,请在C++中使用bool数据类型,它使用实际的true/false值。
编辑:当然,在VB中,您会说If BooleanValue = TRUE。在C++中,相当于if(BooleanValue == true)(请注意==,这是比较运算符,而=是赋值运算符),但在C++中,您可以跳过== true比较,只需使用if(BooleanValue)即可。

只是为了澄清我的“通常”陈述:我见过一些项目使用#define FALSE 0,然后使用#define TRUE !FALSE - Nick Shaw
尼克,在这篇文章中,它说不要使用If BooleanValue == True?在你的回答中,你说VB6中的If BooleanValue = True相当于在C++中写If BooleanValue == True。另外,你能澄清一下你所说的#define on 1是什么意思吗?这是否意味着值为2会返回false?谢谢。 - w0051977
是的,如果你使用if (BooleanValue == TRUE),并且BooleanValue实际上为2,那么这将会失败。因此,本文建议使用if (BooleanValue) - Nick Shaw
@Deanna:怎么样?很想知道。我想一个未初始化的变量在技术上可以被定义为既不是值,但还有其他方式吗?... - Nick Shaw
1
从文件读取时可能会得到垃圾值(因为它仍然是一个32位值……),CopyMemory()来自使用0、1的API等。 - Deanna
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接