2013-09-30 47 views
3

我是C初学者,已经开始在c中编写代码。我对变量的范围有所怀疑。当任何变量写入块内时,它的作用域就在该块内。但是,当使用返回字时,在块外部访问变量的方式如何?如何使用“返回”时访问块外的任何变量?

实施例:

int add(int a, int b) 
{ 
    int c;//scope of c is within this block 
    c=a+b; 
    return c; 
} //it ends here 

void main() 
{ 
    int answer; 
    answer=add(2,3);//how we gets value of "c " here 
    printf("%d",answer); 
} 
+6

您忘记了'javascript'和'php'标签。 –

+1

在C和C++中,函数在语义上返回变量的一个副本。至少在C++中,编译器可以自由地删除副本。 – juanchopanza

回答

7

它不是块外部访问。当您执行return c;时,会返回c的值副本,而不是c本身。

int foo() 
{ 
    int c = 3; 
    return c; 
} 

这只是返回3,c成立。

有些语言允许编译器通过扩展c的作用域来“作弊”,但这是一个optimization并且不会更改逻辑。

+0

最后一点很有意思,+1 –

1

当您在c中编写函数并返回值c的值保存在临时位置(称为堆栈),然后该临时位置被复制到后不再可用。有关这个“堆栈”的更一般的讨论,谷歌在“按下弹出堆栈”

当函数完成时,c的内存被破坏,但该函数返回一个值,并将该值放入answer。该值被复制到answer的内存!

因此,它不是一个范围问题。值只是传递给answer

1

你还应该问函数参数如何从范围到范围?如果我在main()中声明/初始化一个变量,如何在main范围外的函数中使用该参数?

当您调用带参数的函数时,参数将被复制并发送到函数。即使它们是指针参数,它们也会被复制。当函数返回一个值时,该值被复制并发回给函数的任何调用。

这只是从我的C和C++的知识。

相关问题