Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中的全局变量+;可以叫什么? 所以我在浏览几本旧的C++测试书籍,发现其中一个问题的答案非常酷!我以前从未见过这种“语法”,我想问问是否有人知道它实际上是如何工作的,为什么它没有被广泛地教授_C++_Variables_Syntax_Global - Fatal编程技术网

C+中的全局变量+;可以叫什么? 所以我在浏览几本旧的C++测试书籍,发现其中一个问题的答案非常酷!我以前从未见过这种“语法”,我想问问是否有人知道它实际上是如何工作的,为什么它没有被广泛地教授

C+中的全局变量+;可以叫什么? 所以我在浏览几本旧的C++测试书籍,发现其中一个问题的答案非常酷!我以前从未见过这种“语法”,我想问问是否有人知道它实际上是如何工作的,为什么它没有被广泛地教授,c++,variables,syntax,global,C++,Variables,Syntax,Global,问题:将输出提供给以下代码-> intg=10//注意这个变量 无效函数(int&x,int-y){ x=x-y; y=x*10; cout:它们实际上不在“堆栈”或“堆”上。进程的内存空间中有一个特定的部分,用于保存与堆栈或堆不同的静态变量。有关详细讨论,请参阅给出的链接 您仍然可以像使用任何其他变量一样使用此变量,并且确实可以使用指向它的指针并通过指针更改其值 正如其他人所建议的,不要对这个问题太兴奋:它们通常是设计不良的标志,并且存在很多现实的缺点和缺陷。 < P> >代码>::/C++中

问题:将输出提供给以下代码->

intg=10//注意这个变量
无效函数(int&x,int-y){
x=x-y;
y=x*10;
cout:它们实际上不在“堆栈”或“堆”上。进程的内存空间中有一个特定的部分,用于保存与堆栈或堆不同的静态变量。有关详细讨论,请参阅给出的链接

您仍然可以像使用任何其他变量一样使用此变量,并且确实可以使用指向它的指针并通过指针更改其值


正如其他人所建议的,不要对这个问题太兴奋:它们通常是设计不良的标志,并且存在很多现实的缺点和缺陷。

< P> >代码>::/C++中的代码>称为范围解析运算符。。它提供了一种命名变量的方法,这些变量可能位于与当前代码不同的作用域中。
前面有一个可选的作用域规范(
a::g
,例如,对于命名空间
a
),没有任何作用域规范指示“全局”作用域。可以对变量执行任何操作(包括通过指针修改)可以使用具有范围解析运算符的变量。变量的生存位置由定义它的范围定义


静态变量(全局或非全局)位于两个位置之一,具体取决于编译器,也可能取决于它们的初始化方式。例如,请参见。

通过在变量或函数前面加上
::
,可以告诉编译器应该在全局命名空间中查找此变量/函数,即在函数的作用域之外。

是作用域解析运算符。如果在
foo
命名空间中声明了一些
bar
标识符,则可以使用
foo::bar
来表示它。如果范围解析运算符前面没有任何内容,则它表示全局命名空间。这就是为什么
::g
指全局命名空间中的
g
e

它获取存储在main之外的变量,但是内存存储在哪里(堆栈/堆)?我们可以通过指针更改“全局”变量的值吗


我不知道为什么会出现这些问题。他们使用全局变量
g
,就像没有声明本地
g
一样。唯一需要
的原因是因为有两个
g
标识符。你可以用它做任何你能用其他任何东西做的事情相同类型的er对象。

普通
g
表示“使用最局部的
g
”,
::g
表示使用全局
g

更一般地说,
example::g
表示“使用命名空间示例中的
g

另外,如果你能以某种方式避免它(你通常可以),不要使用全局变量,也不要像这样使用诡计,这是非常容易出错的

我的问题是“:(变量)”语法到底是如何工作的


::
是作用域解析运算符。如果前面有类或命名空间的名称,则表示后面的名称在该类或命名空间中起作用。如果前面没有任何内容,则表示后面的名称在全局命名空间中起作用;也就是说,它在任何类、函数或命名空间之外声明。

通常,您可以按名称引用全局变量,而不使用
。这是必需的,因为全局变量被具有相同名称的局部变量隐藏。这是避免全局变量的一个原因:如果添加隐藏它的声明,则代码的含义可能会改变

内存存储在哪里(堆栈/堆)

它位于静态存储中,既不在堆栈上也不在堆上。存储在程序开始时分配,并一直持续到程序结束

如果变量的类型很复杂,则可能在程序启动后的一段时间内才对其进行初始化;当您的代码在初始化之前使用它时,您可能会遇到模糊且痛苦的错误。这是避免全局变量的另一个原因

我们可以通过指针改变“全局”变量的值吗

是的。您的示例就是这样做的,尽管它使用的是引用而不是指针。它也可以在任何时间由任何代码直接更改,例如:
:g=42;
,因此很难推断包含它们的程序的状态。这是避免全局变量的另一个原因

我认为这可能会允许一些非常酷的实现


由于我在这里提到的原因和其他原因,全局变量几乎总是比它们的价值更麻烦。如果我是你,我会避免它们。

全局变量不受欢迎,因为你不能为它们建立不变量(每个人都可以访问它们),并且您需要唯一的名称。
称为作用域解析运算符,它通常用于访问名称空间(例如全局名称空间)。这就像在
std
命名空间中访问
cout
。OP的问题更多的是关于静态变量的性质,而不是
::
操作符。OP的问题更多的是关于静态变量的性质,而不是
操作符。@dvnrrs-你从哪里得到这个想法的?从OP的探索中ion:“我的问题是::(variable)“语法到底是如何工作的?”是的;然后他接着说:“它将变量存储在main之外,但内存存储在哪里(堆栈/堆)?@dvnrrs-很好。我添加了一点关于全局变量存储的内容。OP的问题更多地是关于静态变量的性质,而不是
int g =10; //TAKE NOTE OF THIS VARIABLE

void func(int &x, int y){
    x = x-y;
    y = x*10;
    cout << x << ',' << y << "\n";
}

void main(int argc, char** argv){
    int g = 7;    //Another NOTE
    func(::g,g); // <----- "::g" is different from "g"
    cout << g << ',' << ::g << "\n";

    func(g,::g);
    cout << g << ',' << ::g << "\n";
}