【问题标题】:String and integer multiplication in C++C++中的字符串和整数乘法
【发布时间】:2018-06-08 10:05:58
【问题描述】:

我写了以下代码

#include <iostream>

#define  circleArea(r) (3.1415*r*r)
int main() {
    std::cout << "Hello, World!" << std::endl;
    std::cout << circleArea('10') << std::endl;
    std::cout << 3.1415*'10'*'10' << std::endl;
    std::cout << 3.1415*10*10 << std::endl;

    return 0;
}

输出如下

Hello, World!
4.98111e+08
4.98111e+08
314.15

我的疑问是为什么3.1415 * '10'*'10'4.98111e+08。我想当我将一个字符串乘以一个数字时,数字将被转换为一个产生一个字符串的字符串。我在这里遗漏了什么吗?

编辑:基于 cmets 改写问题,我知道单引号和双引号是不一样的。因此,'1' 表示单个字符。但是,“10”代表什么

【问题讨论】:

  • '10' 不是字符串?!
  • @InAFlash 启用更多编译器警告。
  • @DimChtz,我刚刚打印了,'10',它显示的值是 12592,你能帮我理解 c++ 是如何评估这个值的吗
  • 旁注:circleArea() 作为函数而不是宏会好得多。
  • @InAFlash:我个人不理解反对意见。您提供了一个可编译的示例,清楚地说明了您不理解的领域。数值不明显。我已经升级了。

标签: c++


【解决方案1】:

'10' 是一个多字符文字;注意单引号的使用。它有一个类型int,它的值是实现定义。参照。 "10"const char[3] 类型的文字,该数组的最后一个元素设置为 NUL

通常它的值是'1' * 256 + '0',在 ASCII(C++ 支持的常见编码)中是 49 * 256 + 48,即 12592。

【讨论】:

  • 定义的实现是什么意思?是不是,它依赖于编译器的实现?
  • 读作:不依赖于可移植代码的东西,或者在这种情况下,永远不会。
  • @InAFlash:有些人甚至在switch 块中使用多字符作为case 标签,尽管由于标签值的实现定义性质,我建议不要这样做。见stackoverflow.com/questions/45550674/…
  • @Bathsheba 像往常一样精确回答 +1 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多