您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 神奇的const修饰符

神奇的const修饰符

来源:网络整理     时间:2016/7/18 2:54:27     关键词:

关于网友提出的“ 神奇的const修饰符”问题疑问,本网通过在网上对“ 神奇的const修饰符”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 神奇的const修饰符
描述:

#include
void fun(const int i=0)
{
    printf("%d\n",i); 
}
int main(void)
{
    fun(5);
    fun(10);
    return 0;
}
Turboc 3.0 下运行结果:
5
10
哈哈 !i是一个局部只读的变量?每次调用完毕,将其销毁?形式参数,编译时不分配空间,那么i=1,无意义?那么变量i的定义在何处?i存储在栈内存中?i是个指针?i=0中的0存储在静态存储区?
我个人认为:形参中(const int i=0)定义了一个局部只读变量i;i是一个指针;存储于栈存储空间,在编译时不赋值,运行时0存储于静态存储空间; 随着函数调用的结束,i被销毁,i指向的值0不被销毁,0直到程序的结束被销毁;因此,每次调用函数fun(const int i=0) i被更新,就是说地址被更新。这样,结果才是预料中的事。
各位大虾们,请教,请教!好是糊涂啊!郁闷,郁闷!!!


解决方案1:

只是传入以后在函数内不能改变。

解决方案2:

引用 7 楼 mstlq 的回复:
C/C++ code
fun();//这样调用一次楼主就明白了

++ 解决方案3:

用turbo c调试应该有错误把,c中貌似不支持参数设置默认值的,你应该用得是c++编译器
 楼上几位说的都是正确的,参考之即可

解决方案4:

1楼说的对。

解决方案5:

楼主给的代码我试了在gcc下编译都不能通过,说明给函数的形参赋值,尤其是给一个是常量的形参赋值实在不是一个好主意。
即使以前允许这样做,其实出现这样的结果也很合理,因为编译器根本不关心函数形参的初值是什么,有初值的变量应该放到函数体里啊,形参是传递值的地方,值应该由调用它的代码来定,要不声明怎么可以fun(int,char)连变量名都直接省略呢。它知道类型,留出内存就够了。个人觉得这块内存在栈区。

解决方案6:

形参,函数执行时在栈上分配

解决方案7:

引用 6 楼 jialejiahi 的回复:
楼主给的代码我试了在gcc下编译都不能通过,说明给函数的形参赋值,尤其是给一个是常量的形参赋值实在不是一个好主意。
即使以前允许这样做,其实出现这样的结果也很合理,因为编译器根本不关心函数形参的初值是什么,有初值的变量应该放到函数体里啊,形参是传递值的地方,值应该由调用它的代码来定,要不声明怎么可以fun(int,char)连变量名都直接省略呢。它知道类型,留出内存就够了。个人觉得这块内存在栈区……

c语言不支持默认参数的……
楼主用的应该是按c++方式编译的代码 解决方案8:


fun();//这样调用一次楼主就明白了
解决方案9:

加了const,就说明i的值在fun这个函数体内,不能在变了。
比如下面的做法就会出现编译错误:


void fun(const int i=0)
{
i = 5 + i;
printf("%d\n",i); 
}

但是,如果把上面的const关键字去掉,编译就可以通过了。
在LZ给出的例子中,就这点区别。 解决方案10:

fun();//这样调用一次你不是明白了

解决方案11:

fun(const int i=0),这里的i=0,只不过是默认值,就是直接调用fun()也可以,这时i=0而已,等效于fun(0)

解决方案12:

要求的是常量,你传入的就是常量,所以传什么是什么


以上介绍了“ 神奇的const修饰符”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2760566.html

相关图片

相关文章