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:对于格式不正确,我深表歉意,不太确定我还能怎么把它整洁。
答案 0 :(得分:1)
您写:
返回(i = i + j),此函数中没有i,所以i = 3 + 10 ...返回13?
不,i
不再是3。由于第一次调用return (i = i+j);
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 ,这是一个全局变量。
答案 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;
}
现在,相对容易地解释执行代码时会发生什么:
main()
中,iLocal
的值为0 main
呼叫crypt(5)
crypt
计算iGlobal+jParam
,即3 + 5,并将结果分配给iGlobal
,即iGlobal
是8 crypt
返回8 main
将返回值8分配给iLocal
main
呼叫decrypt(8,10)
decrypt
呼叫crypt(10)
crypt
计算iGlobal+jParam
,即8 + 10,并将结果分配给iGlobal
,即iGlobal
为18 crypt
返回18 decrypt
将返回值18添加到jGlobal
,即jGlobal
为28 printf
打印出iLocal
,8和jGlobal
,28的值如果有的话,最复杂的部分是知道何时将全局变量替换为局部变量(也称为隐藏或阴影),答案是“尽可能”。