c - 全局和局部范围变量(为什么第二个打印输出 28 在这里?)
问题描述
#include <stdio.h>
int i = 3, j = 10;
int crypt(int j)
{
return (i = i+j);
}
void decrypt(int x, int i)
{
j += crypt(i);
}
int main(void)
{
int i = 0;
i = crypt(5);
decrypt(i, j);
printf("|%d %d|", i, j);
return 0;
}
我无法弄清楚为什么它会打印出 |8 28|。
“8”部分,我知道在
i = crypt(5) -> j 在这个函数中现在是 5 -> i = i + j -> 没有 i 因此它使用全局变量 i = 3 -> i = 3 + 5 -> 返回 i = 8
所以 main 函数中的 i 变成了 8。
但是下一个打印输出呢?为什么是 28 而不是 23?
我读它的方式是这样的
解密(i, j) -> 解密(8, 10) -> x 现在是 8,i 现在是 10 在这个函数中 -> j += crypt(i) -> j += crypt(10) -> j in这个函数现在是 10。
return ( i = i + j ),这个函数中没有 i 所以 i = 3 + 10... 返回 13?
那么 j += 13 是 23 吗?
我搞砸了步骤的哪一部分?我一直在在线阅读本地/全球范围,但我仍然不太明白我哪里出错了......感觉就像我在某个地方搞砸了我的价值。
PS:我为糟糕的格式道歉,不太清楚我还能如何把它干净。
解决方案
你写:
return ( i = i + j ),这个函数中没有 i 所以 i = 3 + 10... 返回 13?
不,i
不再是3了。之前改成8,即这里return (i = i+j);
由于第一次调用crypt
当你写:
所以 main 函数中的 i 变成了 8。
这是正确的,但全局i
也发生了变化。
推荐阅读
- php - mysqli_fetch_array 会话的返回值但不是变量
- circuit-sdk - SDK_ERROR 至少一名参与者(需要本人除外)
- serialization - 可证明正确的编组?
- swift - Swift Switch 访问“case”中的嵌套属性
- oozie - 如何在父工作流中命名子工作流操作?
- python - AttributeError:“外星人”对象没有属性“图像”(我正在调用组对象)
- mod-perl2 - 使用 ModPerl::Registry 运行的 CGI 脚本不会在 html 页面上打印结果,只需下载即可
- angular - 如何将用户输入字段行添加到 Mat Table 数据源
- javascript - 使用 JQuery 替换开始和结束标记
- python - 如何子类化 Python 中的内置函数类?