【问题标题】:Qt/QString: No compiler error on misplaced parenthesisQt/QString:错误放置的括号没有编译器错误
【发布时间】:2023-01-27 22:48:50
【问题描述】:

我刚刚从双精度创建了一个 qstring,但我放错了括号。它确实编译并且 QString 在我的电脑上很好,但是这个字符串在我在我朋友的电脑上生成的“1500 m”字符串前面添加了很多垃圾数据。

我的问题是:此代码行中实际发生了什么。为什么它不产生编译器错误?

double distance = 1500;
QString distanceString = QString("%1 m").arg(QString::number(distance), 'f', 1);

没有编译器错误,并且在不同的计算机上有不同的行为。

【问题讨论】:

  • 你用一些奇怪的值调用QString::arg(const QString &a, int fieldWidth, QChar fillChar)
  • 好吧,问题是,因为我放错了括号 'f' 并且 1 是 Qstring.arg 调用的一部分,而不是 QString::number 调用。
  • 是的,它大概会做 arg 调用会做的事情。这里违反直觉的部分是 'f' 隐式转换为 int1 隐式转换为 char (这是一些不可打印的 ASCII 字符)。
  • 所以这不是编译器错误,因为使用 3 个参数调用 arg 在技术上是有效的,因为值都可以转换为参数类型。
  • @perivesta,你应该把它写下来作为答案。

标签: qt qstring


【解决方案1】:

QString("%1 m").arg(QString::number(distance), 'f', 1) 正在调用 3 参数重载 QString::arg(const QString &a, int fieldWidth, QChar fillChar)

所以在这种情况下,您的参数将经过隐式转换:

  • 'f'转换为int,即102
  • 1 转换为 char 并最终成为 SOH ASCII 字符

因为允许隐式地进行这些转换,所以对 arg 的调用格式正确,因此这不是编译错误。

然后该函数将执行设计目的并将 "%1" 替换为您的号码,但填充到 102 的长度,并填充不可打印的 SOH 字符。所以你最终会得到一个看起来很奇怪的输出。

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多