c - 一个常量被分配给另一个常量而没有错误
问题描述
我目前正在学习指针和按值传递的概念,并且我有这个 C 代码块:
void doSomething(int b){
b = 6;
printf("%d", b);
}
int a = 5;
int main(void){
doSomething(a);
printf("%d",a);
return 0;
}
我应该65
在编译和执行时都没有错误的输出。通过跟踪代码,这是我的看法:
- 整数
a
被赋值5
。 - 由于 C 是严格按值传递的,
doSomething(a) == doSomething(5)
.
现在在运行这条线之前b = 6;
,我相当肯定b == 5
。因此,通过运行该行,程序有效地读取:
5 = 6;
一个常数(因为我没有更好的术语)被分配给另一个常数。在 Python 中,这会因语法错误而失败,并且出现错误是有意义的。为什么它不会引发语法错误?
解决方案
如果您查看调试器,您会发现这里有两个变量在起作用,a
一个是在您的代码中,在范围内是全局的b
,另一个是函数的本地doSomething()
变量。
这是两个完全独立的变量。当您调用该doSomething()
函数时,想象会发生以下情况:
stack_push(a);
call(doSomething);
doSomething()
编译器内部执行以下操作:
int b = stack_pop();
...
这就是“副本”的制作方式。
请注意,这种考虑变量的模型是一种近似值,只要根据 C 规范实现相同的结果,优化编译器就可能会做一些完全不同的事情。
推荐阅读
- javascript - Vee-validate 仅验证某些字段
- java - MediaPlayer Android Studio 让我的应用运行缓慢
- talend - TALEND : 如何记录组件级运行时信息
- javascript - 通过 ID angular 6 获取对象:
- full-text-search - 带有特殊字符和“单词开头”的 MariaDB 全文搜索
- python - Python3 列表推导未按预期工作
- javascript - 使用不同的键创建对象
- python - 在特定字符串之后返回文本中的数字
- javascript - 正则表达式超过 10 个数字
- javascript - 如何使用 javascript 创建 HTML 文件