如何在编译时自动区分短和长?

Dav*_*ron 22 c++ auto c++11

我很高兴auto在我的C++程序中使用变量.我知道auto使用模板规则声明的变量来推导变量类型,但我对数字类型的工作原理感到困惑.假设我有:

auto foo = 12;
Run Code Online (Sandbox Code Playgroud)

类型foo可以合理地int或甚至是unsigned char.但是假设在我的程序中稍后我会做一些数学并给foo赋值40亿.那时,我想foo成为一个类型unsigned int或者也许long.

编译器如何预测将在程序中稍后分配的值?

Ron*_*Ron 50

编译器使用存在的信息,在您的情况下是整数文字12.所以它推断出foo类型int.它没有任何预期.您可以使用适当的整数文字后缀:

auto foo = 12ul;
Run Code Online (Sandbox Code Playgroud)

强制foo推断为unsigned long.您不能将变量定义为类型int,然后在行下方期望编译器以某种方式将其更改为另一种类型,因为您分配了一个不适合以前使用的类型的不同值.如果你这样做,它只会导致整数溢出,这是未定义的行为.

有关该主题的更多信息,请查看自动说明符自动类型扣除参考.

  • @DavidLobron,答案并不总是与时间顺序相同.为了将来的读者,您可以通过提及发布它的用户或链接它来指定哪个其他答案有用吗?(您可以通过点击帖子底部的分享按钮获取链接.) (2认同)
  • "你不能将变量定义为int类型然后在线下,期望编译器以某种方式将其更改为另一种类型"实际上OP只是期望C++提供真正的类型推断.如果你使用你赋予`12`的变量作为double,那么编译器将根据用途决定使用`double`作为类型,或`long`或`int`.这可以做到(例如Haskell这样做).类型不会以任何方式改变.但是在C++中,文字是单形的,所以这不起作用. (2认同)

Sla*_*ica 23

"foo的类型可以合理地为int或甚至unsigned char"

不,它不能.C++中的每个表达式都有一个类型,并且在语言中明确定义.在您的情况下,表达式是整数文字,因此类型对应于文字.具体是什么类型,由规则定义:

文字的类型

整数文字的类型是值可以适合的第一种类型,从类型列表中取决于使用哪个数字基数和哪个整数后缀.

无后缀 - int,long int,long long int(自C++ 11起)

"编译器如何预测将在程序后期分配的值?"

这不可以.声明变量时确定类型,以后不能更改.


Lig*_*ica 10

foo的类型可以合理地为int或甚至unsigned char

可能是很多事情,但它实际上只有一两件事.

整数文字12有类型int.

期.

但是假设后来在我的程序中,我做了一些数学运算并给foo赋值40亿.那时,我希望foo有类型unsigned int或者long.编译器如何预测将在程序中稍后分配的值?

他们不能,他们不能.类型foo不会改变.foo没有类型auto(没有这样的东西); 它有类型int.今后你的程序就像你写的一样int foo = 12;.演绎/自动化在那里结束.


小智 5

那时,我想要foo有类型unsigned int或者也许long.

这不是语言的工作方式.变量不能在运行时更改其类型.如果定义并初始化一个变量auto foo = 12;,这意味着正是同样的事情int foo = 12;,不管任何未来的任务,因为类型12int.

编译器如何预测将在程序中稍后分配的值?

他们不必.稍后分配的值将转换为变量的类型.如果该值超出该类型的范围,则确切的规则取决于您正在处理的类型.