我正在使用TypeScript编写编译器,目前的重点是如何将“词法范围”传递给相关对象。实际上,每当代码中有一个概念性的主要分支时,就会创建一个新的词法范围,并将其分配给该AST节点,并将父变量指向其父节点。
module scope
class scope
function scope
function scope # say we have nested functions
conditional-branch scope
conditional-branch scope
...
但我想知道,通常情况下,
当试图编译以下代码片段时:
#include <stdio.h>
#include <time.h>
void change_a(int * a) {
*a = 1;
return;
}
void main(void) {
int a = 0;
change_a(&a);
if (a) {
time_t start = time(NULL);
}
/* do something that never mentions a */
if (a) {
time_t end =
在JavaScript中,一个应该在函数的开头声明所有变量,以减少与变量范围是函数这一事实相关的错误风险。下面的代码通过将"Hello,World“实际打印到控制台来说明这个非直观的范围:
var demo = function () {
if (false) {
var hello = "Hello, World";
}
console.log(hello);
};
类似地,在但不在VB.NET中在VB6中中,变量有一个函数/sub的范围,这也意味着它们最好在函数/子块的顶部声明。
C,C++、Java、C#、Python或P
所以我的问题是:
为什么(以及如何避免) C#中的Is-运算符使用的if寿命更长?
示例:
Animal a = new Cat();
if (a is Cat c)
{
Console.WriteLine(c); // Works
}
Console.WriteLine(c); // Works too
// Leads to an error because c is allready declared
if (a is Cat c)
{
....
}
我所期望的是,因为我在if-条件中声明了变量c,所以它的作用域将被限定为if-条件,什么不是真的。
编辑:我理解括号参
前言
所以,我正在读The C Programming Language,这句话打动了我:
自动变量,包括形式参数,也隐藏了同名的外部变量和函数。
例子:
int x;
// x inside of f is different from external f.
void f(double x){}
TL;DR
我觉得这对所有语言来说都是正确的(它可以追溯到加州兰伯达),但它还是写进了这本书。是否有这样的例子:变量的最本地定义不覆盖更全局的定义?
在C中,如果我们在enum中重新声明变量,那么编译器会给出一个错误,即"'i‘“重新声明为不同类型的符号”.It Ok“。
#include <stdio.h>
int i = 10;
struct S
{
enum
{
i = 20
}e;
};
int main()
{
printf("%d\n", i);
}
但是,在C++中,如果我们在枚举中重新声明变量,那么它就正常工作了。
#include <iostream>
using namespace std;
int i
由于有大量的C++背景,我很难理解ruby函数参数是如何传递的,或者更确切地说,我很难理解按引用传递和按值传递之间的语义差异,这似乎是在ruby社区中所做的区别。有许多关于这个主题的相互矛盾的信息的资源(包括我在下面发布的这个网站,人们的反应似乎有很大的不同)。
我的困惑是在C++按引用传递时:
int function(Object& i)
{
//cannot change the memory location of i in this function
//only the value can change
Object.param1 = 3;
}
我有两个php生成的值:abc和123。这是示例就绪HTML文档。
<script>
var a = 'abc';
var b = '123';
function changeValue()
{
}
</script>
<button onclick="changeValue()">
<script>
var c = 'xyz';
</script>
当单击按钮时,我不知道如何替换var c的值。我应该在changeValue()中使用什么功
我查看了下面的问题,以检查是否可以在函数中定义函数。
被接受的回答是否定的。我试过并得到了同样的结果。
但是当我尝试编译下面的代码(只有声明)时,它确实编译了。我不太清楚为什么允许这样做。
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int a, *b, f(int c); //trying out multiple name declaration
int f(int c);
}
如果一个C++类成员函数访问一个包含定义重载的变量名,定义既作为类的成员变量,又作为成员函数定义的全局范围中的变量,那么成员函数将实际访问哪个变量?情况如下:
某某阶层:
class SomeClass
{
int Num;
void OperateOnNum();
};
SomeClass.cpp:
#include "SomeClass.h"
int Num;
void SomeClass::OperateOnNum()
{
Num = 0;
}
OperateOnNum将对哪一个名词进行手术?Microsoft Visual Stu
我试图向一位同事描述他们的代码是如何构造的,我正在寻找他实现的反模式的名称(它违反的软件原则的加分)。我使用JS演示,但这不是JS特定的。
function x() {
var a, b, c;
var doWork = function(){
a = 1;
b = 2;
addAB();
return c;
};
var addAB = function(){
c = a + b;
};
var result = doWork();
}
他使用父作用域在函数
在使用JavaScript MVC创建ASP.NET时,我注意到了几个作用域警告,并意识到在理解开关/ case语句中的变量范围时,我遗漏了一些东西。
警告:“i”已经定义为,指的是案例b和案例c
我的代码看起来类似于以下内容:
switch(element) {
case 'a':
for(var i=0; i < count; i++){
do something
}
break;
case 'b':
for(var i=0; i < count; i++){
do something
}
我一直在学习C++,我遇到过静态变量(我对C89有先验知识),在我使用的资源中,他们在类中声明了一个静态变量,如下所示:
class nameHere
{
public:
static int totalNum;
}
int nameHere::totalNum = 0;
int main()
{}
例如。我不明白的是,既然我已经在类定义中声明了静态变量是整数,为什么我还需要在类定义之外将其声明为整数呢?像这样简单地初始化它不是很有意义吗:
nameHere::totalNum = 0;
int main()
{}
有没有什么特别的原因或者仅仅是C++的约定?谢谢
我的C很生疏,请帮帮我。
static int i = 42;
int main()
{
}
创建具有全局范围和内部链接的变量i。这意味着任何人都可以引用它,但是只有翻译单元(.c文件)中的条目才不会破坏链接器。它在程序链接期间分配,并在输入main()之前进行初始化。
void foo()
{
static int i = 69;
}
创建一个具有函数作用域且没有链接的变量。这意味着foo()之外的任何东西都不能引用它,即使编译器没有大声喊出来,使用这个(基本上是受保护的全局)变量的地址也是UB。它在程序链接期间分配,并在第一次调用foo()时初始化。
请纠正我!
使用是我的%数据;下面是or还是应该切换到我的$data={};?
#!/usr/bin/perl -wT
use strict;
use JSON;
sub makeJson {
my %data;
$data{kib} = 1;
$data{games} = {
0 => [],
1 => [qw(a b c d e)],
};
return \%data;
}
my $x = makeJson();
print encode_