C语言中是否有范围解析运算符?

我正在阅读一本关于C语言的书( ‘掌握C’ ),并在此处的 Google Books上找到了关于范围解析运算符( ::的主题。

但是当我运行以下代码示例(从本书中复制)时,C编译器给了我一个错误。 我在互联网上搜索但我无法在C中找到任何对范围解析运算符的引用。

 #include  int a = 50; int main(void) { int a =10; printf("%d",a); printf("%d\n", ::a); return 0; } 

因此,如果我想访问全局变量,那么我怎样才能在main()函数中执行此操作?

C号没有示波器分辨率算子。 C ++有一个( :: 。 也许你(或者你的书)将C与C ++混淆。

您询问如何从函数(此处为main )中访问全局变量a ,该函数具有自己的局部变量a 。 你不能在C中这样做。它在词法上超出了范围。 当然你可以把变量的地址带到其他地方并将其作为指针传递,但这完全是另一回事。 只需重命名变量,即‘不要那样做’

不,命名空间是C ++的一个特性。

但是,在您的示例中可以引用全局a 。 您可以使用extern关键字来实现此目的:

 #include  int a = 50; int main(void) { int a = 10; printf("%d\n",a); { // Note the scope extern int a; // Uses the global now printf("%d\n", a); } return 0; } 

不过,这有点棘手。 这是糟糕的风格。 不要那样做。

::运算符在C ++而不是C中可用。如果要访问全局变量,请使用

 #include  int a = 50; int main(void) { int a =10; printf("%d",a); //prints 10 { extern int a; printf("%d", a); //prints 50 } return 0; } 

或者你可以使用一个指针来保存全局变量a的地址,然后如果要打印全局变量a的值,则取消引用指针。

否( ::运算符是特定于C ++的)。 在C中,如果在不同的重叠范围(例如,文件范围a和块范围a )中使用相同的标识符,则块范围标识符会影响文件范围标识符,并且无法引用屏蔽标识符。

通常最好的编程习惯是避免阴影变量。 许多lint类型的程序可以警告这种情况。

在普通C中,没有范围解析。 您必须以不同方式命名变量。

这意味着下面的所有变量都是不同的:

 #include  int a = 50; int main(void) { int a = 10; { int a = 20; int i; for (i = 0; i < 10; i++) { int a = 30; } } return 0; } 

您可以使用指针访问和编辑C中的全局变量。

 #include  #include  int a; a=78; int *ptr=&a; //pointer for global a int main() { int a=0; printf("%d",a); //Prints 0 as local variable printf("%d",*ptr); ptr=30; //changes the value of global variable through pointer printf("%d",*ptr); //Now it prints 30 return 0; }