【问题标题】:We cannot write any assignment statement globally why?我们不能在全局范围内编写任何赋值语句,为什么?
【发布时间】:2015-04-07 09:26:27
【问题描述】:

为什么我们不能全局编写任何赋值语句?我的代码在下面

  #include <stdio.h>
  static int i=10;   //Initialization statement
  i=25;              //Assignment statement not possible why?
  int main()
{
 printf("%d",i);
 return 0;
}

【问题讨论】:

  • 是什么让你认为你应该能够编写不在函数中的任意代码?

标签: c global-variables variable-assignment


【解决方案1】:

这是一个“何时”的问题。

int i=10; 在编译时确定,i 在程序加载或第一次开始运行时采用 10 的值。

全局i=25; 没有无序列。对于多个链接文件,无法控制这些“全局”代码的运行顺序 - 除了链接顺序。

通过将int i=10; 移动到main(),确定评估顺序。

#include <stdio.h>
static int i=10;

int main(void) {
  printf("%d",i);
  i=25;
  printf("%d",i);
  return 0;
}

【讨论】:

    【解决方案2】:

    如果您需要一个变量存在于所有函数的作用域之外,您可以全局声明它,然后您的函数可以根据需要进行修改,而无需将变量传递给函数。

    你所做的是声明然后修改,那么为什么不将它声明为你真正想要的值呢?如果需要更改,请根据需要更改函数内的变量。

    虽然允许全局声明,但问问自己为什么不能在本地声明并将变量传递给函数。如果你不能正确回答这个问题,你可能不应该那样使用变量。请注意,维护一个大程序会变得更加困难,你越是随意声明变量。

    【讨论】:

      【解决方案3】:

      C 与(所谓的)脚本语言(如 Ruby 或 Perl)的工作方式不同。

      尽管看起来很像函数内部的代码(在大括号之间),但函数外部的代码从未真正运行过。编译器使用它来声明和定义可以从实际运行的代码中访问的变量。运行的代码在函数内部定义。

      当编译器编译程序时,它会为每个函数生成可执行代码片段,然后“链接”在一起以生成最终程序。由于执行不是从文件顶部开始的,因此必须为此定义一个位置;在 C 中,编译器会安排在您运行程序时调用“main”函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多