用函数中的const参数进行C编程

时间:2016-07-17 10:19:19

标签: c

我有一个疑问。 请参阅以下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时打印该值。我原以为它会把错误抛到只读。谁能解释一下呢?

4 个答案:

答案 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);
            }