【问题标题】:Why won't auto assign values of type long long?为什么不会自动分配 long long 类型的值?
【发布时间】:2015-01-11 01:14:56
【问题描述】:

使用 auto,我创建了一个变量号并使用 cin.get 来获取值。我使用此代码来执行此操作:

auto number = cin.get();
cout << typeid(number).name() << endl; 

似乎即使我输入了一个超过 2147483647 的数字,该值仍然被分配为 int 类型。为什么是这样?如果数字超过最大 32 位 int 值,不应该自动分配 long 类型的值吗?

【问题讨论】:

  • auto 在编译时被解析,这意味着它在你运行程序之前就已经决定类型应该是int
  • 首先:cin.get() 不会做你认为的那样。其次:Frxstrem 所说的。
  • 您似乎对 auto 的作用有一个不正确的认识。 auto 在编译时推断变量的类型。您在运行时输入的内容对变量类型没有影响。如果你输入“hello world”,它不会神奇地变成一个字符串。
  • 感谢您的回答。我现在明白了,如果我使用 cin,我可以从字面上输入任何内容并获得 int 的返回值,我必须在编译之前初始化该值:p

标签: c++ long-long


【解决方案1】:

auto 在编译时解析,并根据cin.get() 的返回类型决定(恰好是int定义)。

此外,表达式 typeid(number).name() 也在编译时进行评估,这意味着编译器将其解析为一个常量值(例如,我的系统为 "i")并将其存储在可执行文件中。

【讨论】:

  • + 1,但要稍微澄清一下:auto固有编译时间,而typeid 是编译时间只是因为编译器可以预测结果将在这种情况下(因为参数不是多态引用)。 (还值得指出的是,cin.get() 实际上意味着与 OP 认为的完全不同的东西。它只返回一个字符,例如 '2',而不是整个整数。OP 可能被行缓冲弄糊涂了。 )
  • 严格来说,即使编译器可以预测结果是什么,对于多态引用,typeid 表达式仍然需要在运行时评估潜在的副作用.
【解决方案2】:

auto 在编译时解析。编译器推断出number 的类型为int,因为std::istream::get 返回int

如果这是个问题,请在此处明确使用long long

【讨论】:

    【解决方案3】:

    所以auto 不会改变任何东西。而且istream::get()istream::getline() 都没有真正解析输入以查看它是否是一个数字。

    但让我们看看一些选项:

    cin.get()

    这将返回一个表示输入流的一个字符的 int。但它代表的是一个字符,而不是一个数字。

    cin.getline()

    这是一个错误。
    istream::getline() 没有重载,不需要任何参数。

    char s[100]; cin.getline(s, 100);

    这将存储一行输入(如果太长,则存储 100 个字符)并将其存储在字符串 s 中。

    【讨论】:

      【解决方案4】:

      除了已经说过的关于auto...

      这里不可能“输入超过 2147483647 的数字”。 cin.get()未格式化的输入。您正在阅读 bytes,而字节数(假设为 CHAR_BIT==8)只能达到 255。这就是cin.get() 返回int 的原因:它永远不会有更高的值。永远。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多