C语言 “每个未声明的标识符对于每个出现错误的函数只报告一次”是什么意思?

scyqe7ek  于 2023-02-21  发布在  其他
关注(0)|答案(2)|浏览(465)

我知道属于同一数据类型的多个变量可以在一条语句中声明如下:

int x, y, z;

我尝试在一个语句中声明和定义属于同一数据类型的多个变量,如下所示:

#include <stdio.h>

int main() {
  int x = y = z = 50;
  printf("%d", x + y + z);
  return 0;
}

当我试图编译上面的代码时,我得到了以下错误:

prog.c: In function ‘main’:
prog.c:4:11: error: ‘y’ undeclared (first use in this function)
    4 |   int x = y = z = 50;
      |           ^
prog.c:4:11: note: each undeclared identifier is reported only once for each function it appears in
prog.c:4:15: error: ‘z’ undeclared (first use in this function)
    4 |   int x = y = z = 50;
      |               ^

我不明白为什么属于同一数据类型的多个变量不能在一条语句中初始化为同一个值,而声明属于同一数据类型的多个变量是可能的。
我也不理解注解“每个未声明的标识符只在它出现的每个函数中报告一次”的实际含义。
不过,当我尝试下面的代码时,我创建了两个语句分别用于变量声明和定义,一切都很顺利。为什么呢?

#include <stdio.h>

int main() {
  int x, y, z;
  x = y = z = 50;
  printf("%d", x + y + z);
  return 0;
}

并获得预期以下输出:

150
xdyibdwo

xdyibdwo1#

int x = y = z = 50;

赋值运算符=具有从右到左的结合性。上面的语句首先尝试将50赋值给z,但由于它从未声明,因此生成了一个错误。
我不明白为什么属于同一数据类型的多个变量不能在一条语句中初始化为同一个值,而声明属于同一数据类型的多个变量是可能的。
实际上你可以,但前提是先声明它们,在这个例子中,你没有在初始化它们之前声明yz
你要找的是:

1) int x = 50, y = 50, z = 50;

   /* OR */

2) int x, y, z; 
 
   x = y = z = 50;

   /* Or */

3) int x = 50;
   int y = 50;
   int z = 50;

   /* Or */

4) int x, y, z = x = y = 50; /* This is madness. */

我发现每行声明一个变量(第三种方法)可以使代码更清晰,并防止声明指针时出现愚蠢的错误。
我也不理解注解"每个未声明的标识符只在它出现的每个函数中报告一次"的实际含义。
这意味着编译器只报告给定函数中未声明变量的第一个示例。例如,如果您有:

int x = y = z = 50;  /* Compiler only reports this instance */

z = 403;

编译器只在z第一次出现时报告。

oprakyz7

oprakyz72#

你可以把它切成这样的碎片:

int x=y

这是一个初始化,你告诉计算机我需要一个整数x,它等于y,但是y是未声明的,因为你用它作为初始化的值,而不是声明它.
然后我们转到y=z
现在你要给一个未声明的变量y赋值,还有一个未声明的变量z。
然后z=50;
这是一个赋值语句,z从未被声明过,这是它第一次出现在函数中。

int将在左边的第一个变量上强制转换,如果可用,则在每个逗号后面的第一个变量上强制转换。此后的每个变量都将被视为已声明的变量。

第二段代码可以工作,因为编译器已经知道您声明的每个变量,所以没有问题。

相关问题