C++ 在c+中使用三元运算符+;总是返回假条件

C++ 在c+中使用三元运算符+;总是返回假条件,c++,C++,我使用一个三元运算符语句,它总是返回另一个值 BSTR pVal = L"Yes"; bool val = pVal == L"Yes" ? true : false; 此语句返回 val = false; 我希望它在这里回归真实。我做错了吗?这里很多地方都错了 BSTR上的==比较指针值。实现定义了指针相等的两个L“Yes” bool\u expr?true:false是一个noop bool val = wcscmp(pVal, L"Yes") == 0; 这可能是你想要的 BST

我使用一个三元运算符语句,它总是返回另一个值

BSTR pVal = L"Yes";

bool val = pVal == L"Yes" ? true : false;
此语句返回

 val = false;
我希望它在这里回归真实。我做错了吗?

这里很多地方都错了

BSTR
上的
==
比较指针值。实现定义了指针相等的两个
L“Yes”

bool\u expr?true:false
是一个noop

bool val = wcscmp(pVal, L"Yes") == 0;
这可能是你想要的

BSTR pVal = L"Yes";
这是坏消息;这不是创建BSTR的方式。BSTR应该是在特定内存区域中分配的pascal风格的字符串

BSTR pVal = SysAllocString(L"Yes");
通常更好

使用
wcscmp
BSTR
上有效,因为
BSTR
保证以null结尾。但是将以null结尾的字符串分配给
BSTR
不是一个好计划;使用
BSTR
的代码可能期望长度字段位于第一个字符之前

<>代码可能是一个很好的计划,使用C++代码包>代码> >代码> > BSTR 将
BSTR
BSTR
进行比较并且不使用C API通常也是一个好主意;BSTR可以包含嵌入式NUL,而C API在第一个NUL处停止

_bstr_t pVal = L"Yes";

bool val = pVal == _bstr_t(L"Yes");

\u bstr\u t
有一个执行合理操作的
运算符==

bstr
类型不能直接使用
=
进行比较。这与您的问题无关,但这不是创建
bstr
的有效方法。它们应该被分配
SysAllocString
。在C++中,最好使用包装类型,如 I.BSTRUTT ,这也将解决比较问题。不是bug,而是<代码> A==B?true:false通常写入
a==b
bstr\U t
是一种与宽字符串完全不同的类型,需要使用(Windows)操作系统转换函数将一种转换为另一种。@πάνταῥεῖ 不是完全不同(您可以使用wcscmp),但是是的,我添加了这一点。您不能安全地使用C字符串函数。BSTR可以包含嵌入的NUL字符。它们是Pascal样式的字符串,长度存储在字符串中。不是带有sentinel终止符的C样式字符串。@CodyGray部分取决于您希望
=
做什么,但是是的,可能将另一个
L“yes”
包装在BSTR中并使用BSTR批准的比较是一个好计划。另一方面,我可以保证我可以在两个字符串上找到每个
==
的问题;有些语言中,在其他情况下,多个字符的数量会减少,字符的组合代码可以与其他字符相同或不相同,等等。是的,我要明确的是,这不是对你答案的批评,而是对你在评论中与πάντα讨论的回应。在这种非常有限的情况下,您将与字符串文字进行比较,显然可以使用
wcscmp
。我只是想解释一下为什么这不是一个有效的方法。