声明列表中的多个类型说明符

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)

创建两个整数 in 并初始化它们。

当你输入:

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); 

是不正确的,因为在声明符 in 之间遇到了声明说明符 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 循环更灵活、更便携。