我很高兴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,然后在行下方期望编译器以某种方式将其更改为另一种类型,因为您分配了一个不适合以前使用的类型的不同值.如果你这样做,它只会导致整数溢出,这是未定义的行为.
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;,不管任何未来的任务,因为类型12是int.
编译器如何预测将在程序中稍后分配的值?
他们不必.稍后分配的值将转换为变量的类型.如果该值超出该类型的范围,则确切的规则取决于您正在处理的类型.