有人可以解释一下 C 中的变量声明吗

Can someone explain variables declaration in C

我是编程新手,我正在学习 CS50 在线编程课程。所以我有一个任务是用 C 编写一个程序,用户在其中输入一些单词(无论单词前后有多少 space),我们必须打印每个单词的首字母。所以我做了这个程序:

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>

  int main(void)
  {
  int n;
  int i;
  string name = get_string();
  if(name != NULL)
  {
      if (name[0] != ' ')
      {
          printf("%c", toupper(name[0]));
      }
      for(i = 0, n = strlen(name); i < n; i++)
      {
          if(name[i] ==' ' && isalpha(name[i+1]))
          {
              printf("%c", toupper(name[i+1]));
          }
      }printf("\n");
    }
  }

但只有在我声明变量后才正确完成 int n;诠释我; 在那之前,我什至无法编译程序。为什么?起初我宣布 int ifor 循环中,但程序甚至没有编译。不幸的是,我试图声明外部循环并且它是正确的。我不明白这一点。有人可以解释吗? :)

所有变量和函数都必须在使用前声明。变量 i 必须先声明,然后才能用作 for 循环中的索引。

在 1989/1990 标准和更早的 K&R 语言版本中,所有声明都必须位于块中任何可执行语句之前:

void foo( void )
{
  /** 
   * The variable i is used to control a for loop later on in the function,
   * but it must be declared before any executable statements.
   */
  int i;

  /**
   * Some amount of code here
   */

  for( i = 0; i < some_value; i++ ) // K&R and C90 do not allow declarations within the loop control expression
  {
    /**
     * The variable j is used only within the body of the for loop.
     * Like i, it must be declared before any executable statements
     * within the loop body.
     */
    int j;

    /**
     * Some amount of code here 
     */
    j = some_result();

    /**
     * More code here
     */
    printf( "j = %d\n", j );
  }
}

从 1999 标准开始,声明可以与其他语句混合,并且它们可以作为 for 循环的初始表达式的一部分出现:

void foo( void )
{
  /**
   * Some amount of code here
   */
  for ( int i = 0; i < some_value; i++ ) // C99 and later allow variable declarations within loop control expression
  {
    /**
     * Some code here
     */
    int j = some_result(); // declare j when you need it
    /**
     * More code here
     */
    printf( "j = %d\n", j );
  }
}

上面两个代码片段的主要区别在于,在第一种情况下,i 在整个函数主体中可见,而在第二个代码片段中,它仅在 for循环。如果您需要 ifor 循环之后的任何代码可见,那么您需要在循环控制表达式之外声明它:

int i;
for ( i = 0; i < some_value; i++ )
{
  ...
}
...
do_something_with( i );

同样,i必须先声明,然后才能在循环控制表达式中使用;只是在第二种情况下,该声明是循环控制表达式的一部分。

编辑

不知道你用的是什么开发环境或者编译器。您可能想看看是否可以指定要编译的语言版本(例如,在 gcc 中,您可以为 1989/1990 指定 -ansi-std=c90版本和 1999 版本的 -std=c99)。

首先——欢迎使用C语言!我认为 C 是一种很好的入门语言。

变量声明 - 在 C 中,我们只允许在作用域的开头声明局部变量 - 在函数、循环、if 语句的开头等

例如:

  1. 我们不能运行这个:

    for(int i = 0; i<4: ++i) { printf("%d",i); }
    

    声明在 for 语句中 - 而不是在范围的开头。在 C++ 中,此代码将起作用。

  2. 但是,我们可以这样做:

    int foo()
    {
        int i;
        for(i=0;i<4; i++) { ...}
    }
    

备注:传递的局部变量和参数分配在堆栈上。当我们在局部变量上声明时,我们将变量压入堆栈,然后到达作用域的末尾——变量弹出。