-5

代码:

         #include<stdio.h>
         #include<conio.h>
         int main()
         {
                 int a, b, c, d,t;
                 int arr[8]={8,6,5,6,7,8,7,8};
                 int arr_foo[8]={6,7,8,4,8,4,2,7};
                 printf("the first array is\n");
                 for(a=0; a<8; a++)
                 {
                            printf("%d %s", arr[a], ",");
                 }
                 printf("\n");
                 printf("the second array is\n");
                 for(a=0; a<8; a++)
                 {
                            printf("%d %s", arr_foo[a], ",");
                 }
                 printf("\n");
                 for(a=0; a<8; a++)
                 {
                          for(b=a+1; b<8; b++)
                          {
                                     if(arr[a]==arr[b])
                                     {
                                             arr[b]=t;
                                     }
                          }
                          if(arr[a] != t)
                          {
                                 c=0;
                                 for(d=0; d<8; d++)
                                 {
                                       if(arr[a]==arr_foo[d])
                                       {
                                             c++;
                                       }
                                 }
                                 printf("%d %s %d %s\n", arr[a], "found", c, "times");
                   }//end if
           }//end for
           getch();
           return 0;
        }//end main

该代码包含两个数组并搜索第一个数组的元素是否存在于第二个数组中。如果存在,有多少次?
我想知道将任何整数变量放在arr[b]=t哪里是否合理t

4

2 回答 2

2

简短的回答:是的。但是你会得到一个垃圾值。

长答案(Eric Postpischil 更好):

该行为未由 C 标准定义。根据 C 2011 (N1570) 6.3.2.1 2:“如果左值指定了一个可以使用寄存器存储类声明的具有自动存储持续时间的对象(从未使用过它的地址),并且该对象未初始化(未使用初始化器并且在使用之前没有对其进行赋值),行为是未定义的。”</p>

于 2013-07-29T17:07:13.903 回答
0

通常,如果您使用未初始化的对象,则行为未由 C 2011 标准定义:

如果左值指定了一个可以使用寄存器存储类声明的具有自动存储持续时间的对象(从未使用过它的地址),并且该对象未初始化(未使用初始化程序声明并且在使用之前未对其进行分配),行为未定义。

在 C 1999 中,行为被部分定义。使用未初始化的值只会给你一个不确定的值。只要该值不是陷阱表示,代码就会执行,就好像某些对象已被初始化为某个未指定的值。

大多数实现将提供 C 1999 行为,并且不会为int. 但是,如果您使用未初始化的值,至少有一种实现可能会陷入困境(这就是将语言添加到 C 2011 标准的原因)。因此,如果您只想依赖 C 2011 标准,您可能不会使用自动存储持续时间的未初始化对象(除非您获取它们的地址)。

于 2013-07-29T17:10:59.677 回答