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

时间:2017-10-16 10:48:42

标签: c for-loop declaration cs50

#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++)

因为我用n声明了整数int来定义类型。

程序编译得很好:

for(int i = 0, n = strlen(s); i < n; i++)

为什么int需要/ i的良好格式,而在此示例中不是n

7 个答案:

答案 0 :(得分:10)

这是因为这一行:

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++)
{
    ...

答案 1 :(得分:4)

int i = 0, n = strlen(s)是一个声明列表。当你在那里输入逗号时,你说&#34;给我另一个相同类型的变量&#34;。代码与int x, y;

相同

请注意,在某些情况下,在同一行声明多个变量可能会很危险。可能存在初始化误解,并且可能存在关于哪个变量是指针以及哪个变量不是误解的误解。 (int* x, y 声明两个指针。)

因此,始终声明每个变量都在自己的行上是一种好习惯。此外,将循环保持尽可能干净和简单也是一种好习惯。因此,编写该循环的最佳方法可能是:

int n = strlen(s);
for(int i = 0; i < n; i++)

答案 2 :(得分:1)

第一次使用int时,所有逗号分隔的变量现在都是int。

意味着以下2个陈述是相同的:

int a, b; //a = int, b = int
int a; int b; //a = int, b = int

答案 3 :(得分:1)

C允许您在初始类型声明后声明多个变量:

int x, y, z =0, whatever;

不允许在列表中添加额外的类型声明,即使它与原始声明匹配。

答案 4 :(得分:0)

你正在尝试这个;

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'之前定义。

答案 5 :(得分:0)

for(int i = 0, int n = strlen(s); i < n; i++){ /*...*/ }不是有效的C / C ++语法。 for(int i = 0, n = strlen(s); i < n; i++){ /*...*/ }是。 但是,in只能使用相同的类型才能执行此操作。如果你想要它们的输入方式不同,你可以这样做:

{ int i=0; long n=strlen(s); for(; i<n; i++) {  /*...*/ } }

比&gt; = C99 for循环更灵活,更便携。

答案 6 :(得分:-2)

函数strlen(从运算符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] != '\0'; i++ )
    {
        //print i'th character in s
        printf("%c\n", s[i]);
    }

注意你应该释放声明为

的指针s
string s = get_string();

在程序结束时。例如

free( s );