我是编程新手,我参加了这个在线编程课程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 循环中,但程序甚至没有编译。并且运气不好我试图声明外部循环并且它是正确的。我不明白这一点。谁能解释一下? :)
答案 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}的主体内可见循环。如果需要 for
对i
循环之后的任何代码可见,那么您需要在循环控制表达式之外声明它:
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语句等等。
例如:
我们无法运行:
for(int i = 0; i<4: ++i) { printf("%d",i); }
声明在for
声明中 - 不在范围的开头。在C ++中,此代码将起作用。
但是,我们可以执行以下操作:
int foo()
{
int i;
for(i=0;i<4; i++) { ...}
}
备注:传递的局部变量和参数在堆栈上分配。当我们在局部变量上声明时,我们将变量推入堆栈,然后我们到达范围的末尾 - 变量弹出。