代码杂想

来源:互联网 发布:创业软件股吧 编辑:程序博客网 时间:2024/06/07 12:32

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

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

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

0 0
原创粉丝点击