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

Posted

技术标签:

【中文标题】C语言中有范围解析运算符吗?【英文标题】:Is there a scope resolution operator in C language? 【发布时间】:2015-04-02 17:28:13 【问题描述】:

我正在阅读一本关于 C 语言的书 ('Mastering C'),并在 Google Books here 的第 203 页上找到了关于范围解析运算符 (::) 的主题。

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

#include <stdio.h>
int a = 50;
int main(void)

    int a =10;  
    printf("%d",a);
    printf("%d\n", ::a);        
    return 0;

所以如果我想访问一个全局变量,那么我该如何从 main() 函数中做到这一点?

【问题讨论】:

也许你正在读一本关于 C++ 的书? @al-Acme:这是一个 Wikipedia 页面,用 3 种语言(包括 C++)解释范围解析运算符。它并没有说它在 C 中不存在,或者在任何其他语言中都不存在。事实上它说'其他语言......同时具有范围解析和方法访问' - 即它留下了它是否存在于C中的问题。 @munjal007:如果这本书确实是一本 C 书,请随意命名和羞辱。 更不用说duplicate question了。 @abligh 我的观点是,这个问题不值得 3 票,答案也不值得 9 票(并不是说我对你有任何反对 - 你发布正确答案并没有做错任何事) For instance there is one in perl and that's not listed - 我的意思是这需要一个简单的谷歌搜索。 【参考方案1】:

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

#include <stdio.h>
#include <stdlib.h>

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;

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

#include <stdio.h>
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的值,就取消对指针的引用。

【讨论】:

【参考方案4】:

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

但是,在您的示例中可以引用全局 a。 您可以通过使用extern 关键字来实现这一点:

#include <stdio.h>

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;

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

【讨论】:

【参考方案5】:

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

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

#include <stdio.h>
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;

【讨论】:

【参考方案6】:

没有。 C 没有范围解析运算符。 C++ 有一个 (::)。也许您(或您的书)将 C 与 C++ 混淆了。

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

【讨论】:

Perhaps your book is confusing C with C++ 我希望读者是,而不是书。 @iharob:我不做任何假设 :-) 我看过糟糕的书。不过我会编辑它。 @iharob : 书名是精通C.,那本书的问题很好,但是作者犯了一个小错误。 @munjal007 这不是一个小错误,是一个错字。但是操作符在c中不存在,命名空间的概念在c中也不存在。我在第 64 页运算符优先级表上发现了错误。 @abligh 我认为这本书可能不是一个好的参考。如果我正在阅读它,我也会感到困惑。在第 18,19 页查看他们对 Hello world 的版本和解释。 The line `void main()` marks the beginning of the program that gets executed when the program is run. Some traditional compilers may report an error on this line. In such cases, remove the keyword void, chainging the line to `main()`. --- 有趣,我一直以为是 int main。

以上是关于C语言中有范围解析运算符吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++0x decltype 和范围解析运算符

C++20的这些新特性,你都知道吗?

C++20的这些新特性,你都知道吗?

C++20的这些新特性,你都知道吗?

C++20的这些新特性,你都知道吗?

C语言中new的用法