全局和局部作用域变量(为什么第二个输出28在这里?)

时间:2019-01-02 12:34:16

标签: c variables scope global local

const requireCustomFile = require.context(
    './', false, /custom.js$/
)

requireCustomFile.keys().forEach(fileName => {
    requireCustomFile(fileName);
})

我无法弄清楚为什么打印出| 8 28 |。

在“ 8”部分,我了解到

i = crypt(5)->此函数中的j现在为5-> i = i + j->没有i,因此它使用全局变量i = 3-> i = 3 + 5->返回i = 8

因此主函数中的i变为8。

但是下一次打印输出如何?为什么是28而不是23?

我的阅读方式就是这样

解密(i,j)->解密(8,10)->在此函数中x现在是8并且我现在是10-> j + = crypt(i)-> j + = crypt(10)- >该函数中的j现在是10。

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

那么j + = 13是23?

我弄错了步骤的哪一部分?我一直在网上阅读本地/全球范围的书,但我仍然不太明白我哪里出错了……感觉就像我在某个地方搞砸了我的价值一样。

PS:对于格式不正确,我深表歉意,不太确定我还能怎么把它整洁。

4 个答案:

答案 0 :(得分:1)

您写:

  

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

不,i不再是3。由于第一次调用return (i = i+j);

,它之前已更改为8,即这里crypt

写时:

  

因此主函数中的i变为8。

是正确的,但全局i也已更改。

答案 1 :(得分:0)

您在这里有一个全局i和j,以及一个局部i var。在主要情况下,无论您何时引用i,它都会首先检查您的当前作用域-因此对本地i所做的任何更改都不会对全局i进行更改。如果您要求main外部的某个函数对i var做某事,它将首先检查其自身的作用域,然后检查全局i var。在这种情况下,将要进行的更改将在全局i上进行。

所以..第一次-

local i在main中设置,然后接收i = crypt(5)的值;另一件事是,在此函数中,您还将8值分配给了全局i->(i = i + j),然后将8值返回给了本地i。

第二个功能:

decrypt(i,j);在这里,您将本地i(= 8)和全局j(= 10)发送给函数,其中包含:

j + = crypt(i);
这给你j = j +((global)i = 8 + 10):10 + 8 + 10。并将全局i设置为18。

答案 2 :(得分:0)

  

全局变量是在任何函数外部声明的,它们可以是   可在程序中的任何功能上访问(使用)。 局部变量是   在函数内声明,并且只能在该函数内使用。   可以使用不同名称的局部变量   功能。

在第一次调用函数 crypt(5); 时,您已将全局变量值修改为

  

i = i + j ----> i = 3 + 5 ----> i = 8

然后调用 decrypt()函数时, i = 8 由于i为8,因此 j在加号后打印28 ,这是一个全局变量。

You can see how memory is allocated in C

答案 3 :(得分:0)

请考虑以下版本的代码,其中已将变量重命名以避免混淆。

#include <stdio.h>

int iGlobal = 3, jGlobal = 10;

int crypt(int jParam)
{
  return (iGlobal = iGlobal+jParam);
}

void decrypt(int xUnused, int iParam)
{
  jGlobal += crypt(iParam);
}

int main(void)
{
  int iLocal = 0;
  iLocal = crypt(5);
  decrypt(iLocal, jGlobal);
  printf("|%d %d|", iLocal, jGlobal);
  return 0;
}

现在,相对容易地解释执行代码时会发生什么:

  1. main()中,iLocal的值为0
  2. main呼叫crypt(5)
  3. crypt计算iGlobal+jParam,即3 + 5,并将结果分配给iGlobal,即iGlobal是8
  4. crypt返回8
  5. main将返回值8分配给iLocal
  6. main呼叫decrypt(8,10)
  7. decrypt呼叫crypt(10)
  8. crypt计算iGlobal+jParam,即8 + 10,并将结果分配给iGlobal,即iGlobal为18
  9. crypt返回18
  10. decrypt将返回值18添加到jGlobal,即jGlobal为28
  11. printf打印出iLocal,8和jGlobal,28的值

如果有的话,最复杂的部分是知道何时将全局变量替换为局部变量(也称为隐藏或阴影),答案是“尽可能”。