有人可以在C中解释变量声明

时间:2017-05-04 19:15:00

标签: c variables cs50

我是编程新手,我参加了这个在线编程课程CS50。所以我有一个用C编写程序的任务,用户输入一些单词(无论单词之前或之后有多少空格),我们必须打印每个单词的第一个首字母。所以我做了这个程序:

#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 i; 在那之前,我甚至无法编译程序。为什么?起初我宣布 int i for 循环中,但程序甚至没有编译。并且运气不好我试图声明外部循环并且它是正确的。我不明白这一点。谁能解释一下? :)

2 个答案:

答案 0 :(得分:1)

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

根据1989/1990标准和早期的K&amp; 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在整个函数的主体上是可见的,而在第二个片段中,它仅在{{1}的主体内可见循环。如果需要 fori循环之后的任何代码可见,那么您需要在循环控制表达式之外声明它:

for

同样,必须先声明int i; for ( i = 0; i < some_value; i++ ) { ... } ... do_something_with( i ); 才能在循环控制表达式中使用它;它只是在第二种情况下,该声明是循环控制表达式的一部分。

修改

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

答案 1 :(得分:0)

首先 - 欢迎使用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++) { ...}
    }
    
  3. 备注:传递的局部变量和参数在堆栈上分配。当我们在局部变量上声明时,我们将变量推入堆栈,然后我们到达范围的末尾 - 变量弹出。