【问题标题】:"Expected expression before ' { ' token"“'{'标记之前的预期表达式”
【发布时间】:2013-11-20 03:43:03
【问题描述】:

因此,当我尝试将值分配给 int 数组时,我一直遇到这个问题。我读了这个expected expression before '{' token,但我仍然对为什么它出现在我的代码中感到困惑。我有一种感觉,我正在错误地初始化和声明数组,这就是它给我带来问题的原因。

所以,在 main () 之前,我声明了一组全局变量(是的,我知道这很危险,但对于我的目的来说是必需的)。有了这组全局变量,我还想声明一个大小为 3 的双精度数组

double rob_size, rob_tilt;
double rob_leftcolor [3];
double rob_rightcolor [3];

然后在主函数中,我正在初始化变量和数组

rob_size = 1.0;
rob_tilt = 0.0;
rob_leftcolor [3] = {1.0, 0.0, 0.0}; 
rob_rightcolor [3] = {0.0, 1.0, 0.0};

但是,我收到错误消息“'{'令牌之前的预期表达式”。

首先,该错误消息是什么意思?其次,出现该消息是因为我错误地初始化和声明了数组吗?

谢谢

【问题讨论】:

    标签: c arrays


    【解决方案1】:

    最好在声明时进行初始化:

    double rob_size = 1.0;
    double rob_tilt = 0.0;
    double rob_leftcolor [3] = {1.0, 0.0, 0.0}; 
    double rob_rightcolor [3] = {0.0, 1.0, 0.0};
    

    只有数组需要以这种方式完成,但最好以同样的方式完成。

    你的选择是

    rob_leftcolor[0] = 1.0;
    rob_leftcolor[1] = 0.0;
    rob_leftcolor[2] = 0.0;
    

    【讨论】:

    • 因为这就是你在 C 中初始化数组的方式。
    • @user2930701 因为如果数组大小为空,编译器需要知道大小......如果不是,那只是因为 c 语言是这样说的。
    • 是的,使用{...} 作为数组的初始值设定项 用于初始化,而不用于赋值。还必须为这些变量指定存储类,例如, static double rob_size = 1.0 否则你的编译会警告你。
    【解决方案2】:

    Charlie Burns 是正确的,使用实际值初始化数组总是更好。但是,使用您提供的代码,一旦您声明了数组,您就只能设置特定的元素:

    double x[3];
    
    x[0] = 1.1;
    x[1] = 2.2;
    x[2] = 3.3;
    

    如您所见,为了设置变量,您可以使用括号内与您要设置的元素相对应的数字。声明数组后不能一次全部设置。

    【讨论】:

      【解决方案3】:

      看了答案和cmets,我觉得还有几点需要澄清:

      1. 如果变量在任何函数体之外定义/声明 编译单元,您必须指定存储类,例如 static
      2. 这些变量会放到你的BSS部分 可执行文件。然后你最好初始化。
      3. 当定义一个 数组,你可以使用初始化器{...} 来初始化它。但是你 不能在赋值语句中使用它。
      4. double rob_leftcolor[3] = {1.0, 0.0, 0.0} 是定义,rob_leftcolor[3] = {1.0, 0.0, 0.0} 是赋值,所以这里不能使用初始化器。
      5. 请确保您了解 C 中声明和定义之间的区别。

      对于存储类,考虑下面的情况,没有static,你实际上是在定义全局变量:

      // a1.c
      static double rob_size, rob_tilt;
      rob_leftcolor [3] = {1.0, 0.0, 0.0};
      rob_rightcolor [3] = {0.0, 1.0, 0.0};
      
      int main(int argc, char** argv) {
          rob_size = 1.0;
          rob_tilt = 0.0;
          return 0;
      }
      
      // a2.c
      rob_leftcolor [3] = {1.0, 0.0, 0.0};
      

      然后编译并链接它们:

      $ gcc -c a1.c
      a1.c:2:1: warning: data definition has no type or storage class [enabled by default]
      a1.c:3:1: warning: data definition has no type or storage class [enabled by default]
      $ gcc -c a2.c
      a2.c:1:1: warning: data definition has no type or storage class [enabled by default]
      $ gcc -o a a1.o a2.o
      a2.o:(.data+0x0): multiple definition of `rob_leftcolor'
      a1.o:(.data+0x0): first defined here
      collect2: error: ld returned 1 exit status
      

      【讨论】:

      • 您能扩展一下指定存储类的第一个概念吗?
      • 您不必指定存储类。
      • 存储类定义了 C 程序中变量和/或函数的范围(可见性)和生命周期。可以在 C 程序中使用以下存储类:autoregisterstaticextern。其实auto 是默认的,你不需要用auto 存储类显式指定一个变量。存储类可以参考“The C Programming Language”。
      • 如果没有指定存储类,编译会警告你。
      • 有趣,我的 gcc 和 clang 没有警告。
      【解决方案4】:

      Q1:该错误消息是什么意思?

      A1:错误意味着编译器不希望您将数组分配给标量。当您指定 rob_leftcolor[3] = {1.0, 0.0, 0.0}; 时,您告诉编译器,我希望您将值向量 {1.0, 0.0, 0.0} 分配给数组 rob_leftcolor 的第 4 个元素(计数从 0 - 0, 1, 2, 3 开始)。编译器需要像rob_leftcolor[0] = 1.0 这样的东西。如您所见,您不能用 3 个元素代替 1 个元素。此外,您尝试分配到三个元素的数组中的第四位。

      Q2:出现该消息是因为我错误地初始化和声明了数组吗?

      A2:您正确地声明了数组,但没有分配它们。

      其他人已经正确地告诉了你首选的方法。

      作为替代方案,您还可以使用 C99 标准中引入的复合文字运算符。

      double rob_size = 1.0;
      double rob_tilt = 0.0;
      double *rob_leftcolor; 
      double *rob_rightcolor;
      ...
      rob_leftcolor = (double []){1.0, 0.0, 0.0};
      rob_rightcolor = (double []){0.0, 1.0, 0.0};
      

      请注意,此数组的范围仅在您为其分配的函数内。

      【讨论】:

        猜你喜欢
        • 2012-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        相关资源
        最近更新 更多