代码杂想

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

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标准中定义,由各大编译器自行决定(这可不是一个好程序员该做的)。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值