首页 > 解决方案 > 全局和局部范围变量(为什么第二个打印输出 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:我为糟糕的格式道歉,不太清楚我还能如何把它干净。

标签: cvariablesscopegloballocal

解决方案


你写:

return ( i = i + j ),这个函数中没有 i 所以 i = 3 + 10... 返回 13?

不,i不再是3了。之前改成8,即这里return (i = i+j);由于第一次调用crypt

当你写:

所以 main 函数中的 i 变成了 8。

这是正确的,但全局i也发生了变化。


推荐阅读