首页 > 解决方案 > 一个常量被分配给另一个常量而没有错误

问题描述

我目前正在学习指针和按值传递的概念,并且我有这个 C 代码块:

void doSomething(int b){
    b = 6;
    printf("%d", b);
}
    
int a = 5;

int main(void){
    doSomething(a);
    printf("%d",a);
    return 0;
}

我应该65在编译和执行时都没有错误的输出。通过跟踪代码,这是我的看法:

现在在运行这条线之前b = 6;,我相当肯定b == 5。因此,通过运行该行,程序有效地读取:

5 = 6;

一个常数(因为我没有更好的术语)被分配给另一个常数。在 Python 中,这会因语法错误而失败,并且出现错误是有意义的。为什么它不会引发语法错误?

标签: cparametersvariable-assignmentpass-by-value

解决方案


如果您查看调试器,您会发现这里有两个变量在起作用,a一个是在您的代码中,在范围内是全局的b,另一个是函数的本地doSomething()变量。

这是两个完全独立的变量。当您调用该doSomething()函数时,想象会发生以下情况:

stack_push(a);
call(doSomething);

doSomething()编译器内部执行以下操作:

int b = stack_pop();
...

这就是“副本”的制作方式。

请注意,这种考虑变量的模型是一种近似值,只要根据 C 规范实现相同的结果,优化编译器就可能会做一些完全不同的事情。


推荐阅读