【问题标题】:global variable not returning the right result全局变量没有返回正确的结果
【发布时间】:2020-07-06 15:33:14
【问题描述】:
#include <stdio.h>

int num1;
void newfun();
void main()
{
    int num2;
    num1 = 10;
    num2 = 20;
    newfun();
    printf("%d %d", num1, num2);
}
void newfun()
{
    int num2 = 30;
    int num1 = 40;
}

书上说值的结果是num1=40num2=20 但我不断返回num1=10num2=20

为什么全局变量不起作用?

谢谢

【问题讨论】:

  • 局部变量会覆盖同名的全局变量。
  • 如果这个例子和书中出现的完全一样,那么这本书就有错误。我建议查找勘误表,如果已发布。
  • @EugeneSh。我想在这个例子中,它甚至与阴影无关,因为初始化明确地专用于本地num1 的声明。如果这是newfun() 中的一项任务,那么阴影将是一个主题。
  • 这本书在变量的主题上是错误的。 main 函数的返回类型也是错误的。你需要一本更好的书。
  • 这是什么书?是“让我们 C”吗?

标签: c scope global


【解决方案1】:

newfun() 中声明了新变量 num1(与全局同名),并且局部变量的优先级高于全局。

如果你想改变全局变量 num1 你可以这样写:

void newfun()
{
    int num2 = 30;
    num1 = 40;
}

【讨论】:

    【解决方案2】:

    不应该是这样的。 10 和 20 是正确且预期的输出。每当局部变量和全局变量具有相同的名称时,全局变量就不能在函数内部访问(该函数具有同名的局部变量)。所以基本上没有任何变化,输出应该是 10、20。

    【讨论】:

      【解决方案3】:
      int num1 = 40;
      

      newfun() 中的int num1 是一个新的函数局部变量的声明,它与全局变量具有相同的标识符name1。所以你不用这个语句来处理全局变量。

      相反,您将局部变量num1 初始化为40 的值,该变量在函数执行后被销毁,因为它的存储类是automatic。

      全局变量仍然包含在main() 中分配的10 的值,这是在调用printf() 时为其打印的值,这是完全正确的。


      旁注:

      • void main() 不正确。您至少需要使用int main() 甚至更好的int main (void) 才能提供完整的原型。

      • 如果这确实与书中的示例完全相同,并且它说其他任何内容都会是输出,那么您迫切需要更好的知识来源。 F.e.:Modern C Jens Gustedt。

        其他,包括这本,您可以在这本关于 C 编程的精彩书籍中找到:

        The Definitive C Book Guide and List

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 2014-09-13
        • 2012-08-01
        • 2014-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多