【问题标题】:C++ Builder allows String Comparison with Int - why?C++ Builder 允许与 Int 进行字符串比较 - 为什么?
【发布时间】:2018-12-07 14:19:30
【问题描述】:

我最近开始研究使用 C++Builder (Borland) 构建的旧解决方案。

我遇到了允许一些意外操作的代码。

1) 将 int 赋值给 String 而不进行转换:

String x = 12; //this works... I would expect a type mismatch..

2) String 与 int 的比较没有问题:

String s = "12";
int x = 12;
bool b = s == x; // Again... I expect an error..

C++Builder 会做一些自动转换吗? 是否有针对 C++Builder 的“我不敢相信他们会这样做”的列表?

【问题讨论】:

  • 什么是String?它不是标准的 C++ 类型。
  • Borland“标准”字符串类(不要与 C++ 标准 std::string 类混淆)通常允许从整数类型进行隐式转换,因为它们具有非显式构造函数。
  • IMO,很多关于 C++Builder 的问题都倾向于使用 C++Builder 和 Delphi 特定的类型。我不会使用通用 C++ 标签,只使用 C++Builder 标签。那么就不会出现这样的问题了。这是一个关于 C++Builder 的字符串的问题,所以无论如何都不是一般的 C++ 问题。

标签: c++ string c++builder


【解决方案1】:

这是 Borland C++ Builder 字符串(不是标准 C++ 的 std::string)。

这种方式允许您创建几乎所有类型的字符串,正如this Borland C++ Builder Strings reference 提到的那样:

AnsiString 类提供了许多构造函数,允许您 创建任何类型的字符串。例如,您可以使用它来声明:

一个整数:

AnsiString Int = 120;

正如 RemyLebeau 所说:请注意,String 不是实际类型,它是AnsiString(C++Builder 2007 及更早版本)或UnicodeString(C++Builder 2009 及更高版本)的别名。两者都实现了数字类型的隐式转换。

【讨论】:

    【解决方案2】:

    这是just how it was made

    常识是不允许像这样在字符串和其他类型之间进行隐式转换,但这种东西已经很老了,现在可能不会这样了。

    我建议尽可能坚持使用标准类型。

    【讨论】:

    • ... 除了 std::string 也“允许”这个 ;-) — 和段错误。 Borland 的行为不是很好,但它比标准的类行为明智一千倍。
    • 试试std::string str = 0; std::cout << str;……但你已经知道我的意思是这样的,不是吗?
    • @KonradRudolph 空指针文字是一个突破性案例,是的。但是对于整数来说通常不是这样,对于问题中被问到的整数也不是这样。不,我不知道这就是你的意思,因为你没有说出来!
    • 很公平。我原以为引号、笑脸和对段错误的引用就足够了。
    猜你喜欢
    • 1970-01-01
    • 2018-10-04
    • 2012-11-27
    • 1970-01-01
    • 2022-08-14
    • 2021-07-23
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多