代码杂想

今天码了个代码,但是发现有些奇葩的地方

int f(int const &s)
{
	const_cast<int&>(s) = 3;
	cout <<"\n s's address :"<< &s<<"  s's value:"<<s;
	return s;
}
void main(void){
	const int w = 4;
	
	int const *p = &w;
	int ww = const_cast<int&>(w);
	ww++;
	cout << "\n w's address:" << p << "  w's value:" << w;
	f(w);
	cout << "\n w's address:" << p << "  w's value:" << w;
	data stats;
	collectdata(stats);
	print(stats);
	system("pause");
}

结果显示

虽然这种事情不会出现在项目中(没人这么无聊这么测试),不过就是觉得有些奇葩,这结果显示3的确只存在于f()函数中,而且只有局部作用域,但是问题是显示的地址一样,也说明的确处理的是同一个变量,看来这肯定是与const_cast的实现有关了(CPP不推荐类型转换,因为不好,而且容易出错),这里就是觉得有些奇怪而已,暂时没找到这种情况的解答,希望有高手帮忙解答,谢谢。

经过昨晚 小全同学的解释,这是常量折叠,意思就是当在代码中写出const int w=4 这样的语句的时候,大多数的编译器会在编译的时候直接用数字4代替所有 w 出现过的地方,它的行为和宏类似,但是它却有内存地址,所以才有主函数中凡是 w 的 地方都是显示4,而地址也的确说明是同一个区域,那说明另一个const_cast的确是运行时才确定的,但是使用const_cast这样的操作符会导致未定义行为,就是如上面例子中给他去const属性然后还对它赋值本身就是一种违反const的行为,这种行为没有在cpp标准中定义,由各大编译器自行决定(这可不是一个好程序员该做的)。

所以,上面的结果其实涉及了两个知识点。 

posted @ 2014-11-22 22:01  仙守  阅读(231)  评论(0编辑  收藏  举报