有人可以解释一下 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 i
在 for 循环中,但程序甚至没有编译。不幸的是,我试图声明外部循环并且它是正确的。我不明白这一点。有人可以解释吗? :)
所有变量和函数都必须在使用前声明。变量 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
循环。如果您需要 i
对for
循环之后的任何代码可见,那么您需要在循环控制表达式之外声明它:
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 语句的开头等
例如:
我们不能运行这个:
for(int i = 0; i<4: ++i) { printf("%d",i); }
声明在 for
语句中 - 而不是在范围的开头。在 C++ 中,此代码将起作用。
但是,我们可以这样做:
int foo()
{
int i;
for(i=0;i<4; i++) { ...}
}
备注:传递的局部变量和参数分配在堆栈上。当我们在局部变量上声明时,我们将变量压入堆栈,然后到达作用域的末尾——变量弹出。
我是编程新手,我正在学习 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 i 在 for 循环中,但程序甚至没有编译。不幸的是,我试图声明外部循环并且它是正确的。我不明白这一点。有人可以解释吗? :)
所有变量和函数都必须在使用前声明。变量 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
循环。如果您需要 i
对for
循环之后的任何代码可见,那么您需要在循环控制表达式之外声明它:
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 语句的开头等
例如:
我们不能运行这个:
for(int i = 0; i<4: ++i) { printf("%d",i); }
声明在
for
语句中 - 而不是在范围的开头。在 C++ 中,此代码将起作用。但是,我们可以这样做:
int foo() { int i; for(i=0;i<4; i++) { ...} }
备注:传递的局部变量和参数分配在堆栈上。当我们在局部变量上声明时,我们将变量压入堆栈,然后到达作用域的末尾——变量弹出。