C++编译时的类型推导

首先明确一点,VisualStudio实现的C++的类型推导是在编译时进行的。

如下代码:

#include <iostream>
using namespace std;
int main() 
{  
	int a = 10000;
	char c = 'a';
	cout << ((2 > 1) ? a : c)  << endl;
	cout << ((2 > 3) ? a : c)  << endl;
	return 0;
}
下面是VS2010的输出:



如果在运行时可以自动推断的话,那么第二行的输出就应该是'a'。所以得出结论,VisualStudio的C++的实现中,类型推导是在编译时进行的。


问题来了,今天忽然发现,可能在编译期间存在两套推导系统。

代码如下:

#include <iostream>
using namespace std;
int main() 
{  
	char c = 'a';
	c = c + 256;
	c = c + 255;
	cout << c + 1 << endl;
	return 0;
}
将警告等级调制LV4,会报警告“warning C4244: “=”: 从“int”转换到“char”,可能丢失数据”。

但令人奇怪的是,警告的行是c = c + 256的那行,而下一行c = c + 255并没有报警告(对两行赋值语句单独测试时一样如此)。

说明类型推导时,将(c+256)视作int型变量,而将(c+255)视作char型变量。

但在cout时,却将(c+1)视作整型变量来输出。令人费解。


所以,这里有疑问,到底在类型推导时,将(c+255)这个表达式视作何种类型了呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值