首页 > 解决方案 > 为什么我不能在 for 循环的初始语句中声明多个变量?

问题描述

当使用带有一个变量的 a 时,我们将其声明为 0,因为 i=0 就像这里一样

但是当我们使用两个变量时,就好像我添加 n = strlen 以使代码更高效时,不声明 i=0 而是使用逗号并声明 n=strlen(s) 。为什么我们不能使用 'i=0;' 在这里就像在前面的代码中所做的那样?

编辑:cs50.h 是沙盒 cs50 的一部分,由哈佛制造。

#include <stdio.h>
#include <string.h>

int main(void)
{
    string s = get_string("Input:  ");
    printf("Output: ");
    for (int i = 0; i < strlen(s); i++)
    {
        printf("%c\n", s[i]);
    }
}
#include <cs50.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    string s = get_string("Input: ");
    printf("Output:\n");
    for (int i = 0, n = strlen(s); i < n; i++)
    {
        printf("%c\n", s[i]);
    }
}

标签: ccs50

解决方案


从 C 标准ISO/IEC 9899:TC3 / ISO/IEC 9899/C11for中,语句的语法描述§(6.8.5) 迭代语句有 2 种不同的形式:

for ( expression_opt ; expression_opt ; expression_opt ) statement

for (declaration expression_opt ; expression_opt ) statement

请注意,在第一个表单中,我们在第一个位置有一个表达式,尽管它是可选的,因为所有 3 个字段,并且语句表单的所有 3 个部分都由;用作分隔符的分号分隔。

在第二种形式中,我们可以看到括号中的第一个元素是声明而不是表达式,我们还可以注意到没有分号分隔它。这是因为声明本身总是以分号结尾

(6.7) 段声明描述了声明的语法:

declaration-specifiers init-declarator-list_opt ;

如您所见, adeclaration始终以分号结尾。

一个声明当然可以采用多个声明的形式,如下所示:

for (int i = 0, n = strlen(s); i < n; i++)
{
    printf("%c\n", s[i]);
}

因此,您使用的是分号分隔声明的第二种形式(不是 的第一部分for

使用多个分号只是语法错误。


推荐阅读