声明列表中的多个类型说明符
Multiple type specifiers in declaration list
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
//ask user for input
string s = get_string();
//make sure get_string() returned a string
if(s != NULL)
{
//iterate over the characters one at a time
for(int i = 0, int n = strlen(s); i < n; i++)
{
//print i'th character in s
printf("%c\n", s[i]);
}
}
else
{
//tell the user that their input is not a string
printf("Sorry, no good\n");
}
}
编译器抱怨这一行:
for(int i = 0, int n = strlen(s); i < n; i++)
因为我用int
声明了整数n
来定义类型。
程序编译正常:
for(int i = 0, n = strlen(s); i < n; i++)
为什么在这个例子中 int
required/good 是 i
的形式,而不是 n
的形式?
当您第一次使用 int
时,所有逗号分隔的变量现在都是整数。
意思是下面两个语句是一样的:
int a, b; //a = int, b = int
int a; int b; //a = int, b = int
第int i = 0, n = strlen(s)
行是声明列表。当你在那里输入逗号时,你会说 "give me another variable of the same type"。该代码与 int x, y;
.
之类的代码相同
请注意,在某些情况下,在同一行声明多个变量可能很危险。可能存在初始化误解,并且可能会误解哪个变量是指针,哪个不是。 (int* x, y
不 声明两个指针。)
因此,始终 将每个变量声明在其自己的行中是一种很好的做法。此外,保持 for 循环尽可能干净和简单也是一种很好的做法。因此,编写该循环的最佳方式可能是这样的:
int n = strlen(s);
for(int i = 0; i < n; i++)
因为这一行:
int i = 0, n = strlen(s)
创建两个整数 i
和 n
并初始化它们。
当你输入:
int i = 0, int n = strlen(s)
您创建了一个名为 i
的 int 并对其进行了初始化,然后您尝试创建另一个名为 int n
的 int,这没有任何意义。
没有理由在原处初始化 n
- 毕竟它不应该改变。在循环之前初始化它:
int n = strlen(s);
for(int i = 0; i < n; i++)
{
...
C 允许您在初始类型声明之后声明多个变量:
int x, y, z =0, whatever;
不允许在列表中添加额外的类型声明,即使它与原始类型相匹配。
函数 strlen
的 return 类型(从运算符 sizeof
开始)是 size_t
,通常是无符号整数类型的别名 unsigned long
.所以类型 int
无法容纳类型 size_t
.
的所有值
所以不要使用类型 int
,而是使用类型 size_t
。
此外,您显示的 for 循环包含语法错误。
C 标准中定义的声明如
declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration
因此声明说明符应位于所有声明符之前,即标识符列表中所有声明的标识符。
所以这个声明在for循环中
int i = 0, int n = strlen(s);
是不正确的,因为在声明符 i
和 n
之间遇到了声明说明符 int
.
写
for( size_t i = 0, n = strlen(s); i < n; i++)
而不是
for(int i = 0, int n = strlen(s); i < n; i++)
其实不需要调用函数strlen
。没有它也可以写循环。
for( size_t i = 0; s[i] != '[=14=]'; i++ )
{
//print i'th character in s
printf("%c\n", s[i]);
}
注意你应该释放像
这样声明的指针s
string s = get_string();
在程序结束时。例如
free( s );
您正在尝试这个;
int i = 0, int n =strlen(s);
不行。
同样是
int i = 0 , char s ;
你需要尝试那些:
int i = 0, n=strlen(s);//or
/*-----------------*/
int n = strlen(s);
for(int i = 0;....)//or
/*-----------------*/
int i = 0;int n= strlen(s);//unnecessary but not wrong
并且不要在for(...)定义不相关的veriable,在'for'之前定义。
for(int i = 0, int n = strlen(s); i < n; i++){ /*...*/ }
是无效的 C/C++ 语法。
for(int i = 0, n = strlen(s); i < n; i++){ /*...*/ }
是。
不过,您只能这样做 i
并且 n
具有相同的类型。如果您希望它们以不同的方式输入,您可以这样做:
{ int i=0; long n=strlen(s); for(; i<n; i++) { /*...*/ } }
它比 >=C99 for
循环更灵活、更便携。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
//ask user for input
string s = get_string();
//make sure get_string() returned a string
if(s != NULL)
{
//iterate over the characters one at a time
for(int i = 0, int n = strlen(s); i < n; i++)
{
//print i'th character in s
printf("%c\n", s[i]);
}
}
else
{
//tell the user that their input is not a string
printf("Sorry, no good\n");
}
}
编译器抱怨这一行:
for(int i = 0, int n = strlen(s); i < n; i++)
因为我用int
声明了整数n
来定义类型。
程序编译正常:
for(int i = 0, n = strlen(s); i < n; i++)
为什么在这个例子中 int
required/good 是 i
的形式,而不是 n
的形式?
当您第一次使用 int
时,所有逗号分隔的变量现在都是整数。
意思是下面两个语句是一样的:
int a, b; //a = int, b = int
int a; int b; //a = int, b = int
第int i = 0, n = strlen(s)
行是声明列表。当你在那里输入逗号时,你会说 "give me another variable of the same type"。该代码与 int x, y;
.
请注意,在某些情况下,在同一行声明多个变量可能很危险。可能存在初始化误解,并且可能会误解哪个变量是指针,哪个不是。 (int* x, y
不 声明两个指针。)
因此,始终 将每个变量声明在其自己的行中是一种很好的做法。此外,保持 for 循环尽可能干净和简单也是一种很好的做法。因此,编写该循环的最佳方式可能是这样的:
int n = strlen(s);
for(int i = 0; i < n; i++)
因为这一行:
int i = 0, n = strlen(s)
创建两个整数 i
和 n
并初始化它们。
当你输入:
int i = 0, int n = strlen(s)
您创建了一个名为 i
的 int 并对其进行了初始化,然后您尝试创建另一个名为 int n
的 int,这没有任何意义。
没有理由在原处初始化 n
- 毕竟它不应该改变。在循环之前初始化它:
int n = strlen(s);
for(int i = 0; i < n; i++)
{
...
C 允许您在初始类型声明之后声明多个变量:
int x, y, z =0, whatever;
不允许在列表中添加额外的类型声明,即使它与原始类型相匹配。
函数 strlen
的 return 类型(从运算符 sizeof
开始)是 size_t
,通常是无符号整数类型的别名 unsigned long
.所以类型 int
无法容纳类型 size_t
.
所以不要使用类型 int
,而是使用类型 size_t
。
此外,您显示的 for 循环包含语法错误。
C 标准中定义的声明如
declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration
因此声明说明符应位于所有声明符之前,即标识符列表中所有声明的标识符。
所以这个声明在for循环中
int i = 0, int n = strlen(s);
是不正确的,因为在声明符 i
和 n
之间遇到了声明说明符 int
.
写
for( size_t i = 0, n = strlen(s); i < n; i++)
而不是
for(int i = 0, int n = strlen(s); i < n; i++)
其实不需要调用函数strlen
。没有它也可以写循环。
for( size_t i = 0; s[i] != '[=14=]'; i++ )
{
//print i'th character in s
printf("%c\n", s[i]);
}
注意你应该释放像
这样声明的指针s
string s = get_string();
在程序结束时。例如
free( s );
您正在尝试这个;
int i = 0, int n =strlen(s);
不行。 同样是
int i = 0 , char s ;
你需要尝试那些:
int i = 0, n=strlen(s);//or
/*-----------------*/
int n = strlen(s);
for(int i = 0;....)//or
/*-----------------*/
int i = 0;int n= strlen(s);//unnecessary but not wrong
并且不要在for(...)定义不相关的veriable,在'for'之前定义。
for(int i = 0, int n = strlen(s); i < n; i++){ /*...*/ }
是无效的 C/C++ 语法。
for(int i = 0, n = strlen(s); i < n; i++){ /*...*/ }
是。
不过,您只能这样做 i
并且 n
具有相同的类型。如果您希望它们以不同的方式输入,您可以这样做:
{ int i=0; long n=strlen(s); for(; i<n; i++) { /*...*/ } }
它比 >=C99 for
循环更灵活、更便携。