我有一个疑问。 请参阅以下C程序
int main(void){
unsigned int consttest_var = 1;
unsigned int i;
for(i = 0; i<10; i++){
consttest_var++;
consttest_func(consttest_var);
}
return 0;
}
void consttest_func(const unsigned int consttest_var1){
printf("\n%d", consttest_var1);
}
我尝试了上面的代码,我得到consttest_var1
的价值为2,3,4 .... 10。为什么consttest_var1
应该在声明为const时打印该值。我原以为它会把错误抛到只读。谁能解释一下呢?
答案 0 :(得分:1)
unsigned int consttest_var = 1;
在这里你宣布它为非const。
当您将其发送到consttest_func(consttest_var)
时,该函数需要const unsigned int
声明:void consttest_func(const unsigned int consttest_var1)
函数本身不允许更改参数,因为它是const,但在函数范围之外,变量不是const,因此可以修改
总结一下 - 你的functoin需要一个const变量,而不是修改它 - 因为它应该
请参阅this以获取有关const
的更多信息注意:将变量声明为const并不意味着您不能在其他地方修改(作为参数)。例如,这个代码将编译,即使我得到一个const并递增它,因为虽然a被定义为const
函数f得到的是它的副本,并且副本是可修改的。
#include <stdio.h>
int f(int a){
a++;
return a;
}
int main(){
const int a = 1;
printf("\n%d",f(a));
return 0;
}
答案 1 :(得分:1)
我原以为它会把错误抛到只读。
void consttest_func(const unsigned int consttest_var1){
printf("\n%d", consttest_var1);
}
您的consttest_func
从未真正修改参数consttest_var1
,因此不会将任何错误视为只读。
如果您实际修改了consttest_func
中的参数,例如使用consttest_var1++;
之类的语句,那么它会像您期望的那样抛出read-only parameter
。
答案 2 :(得分:0)
const变量consttest_var1
在函数consttest_func的本地声明。函数结束后,consttest_var1
超出范围。
当您再次调用该函数时,堆栈中的新空间将分配给新的const consttest_var1
,在初始化之后将不会更改。
答案 3 :(得分:0)
主要原因是每次调用函数时,都会向其传递一个新值。在你的程序中,你的变量&#39; consttest_var1&#39;是不是无关紧要。是不变的,因为你的功能只是显示收到的值。 常量变量是一个变量,其值在初始化后无法修改。按照程序中的评论......
int main(void)
{
unsigned int consttest_var = 0;
unsigned int i;
for(i = 0; i<10; i++){
consttest_var++;
consttest_func(consttest_var);
}
return 0;
}
void consttest_func(const unsigned int consttest_var1)
{
consttest_var1=3; //suppose if u write this line.
/* then this line will throw an error that u were talking about
i.e. assignment of read only parameter
as u are modifying the value of a constant variable */
printf("\n%d", consttest_var1);
}