有可能解决这个问题吗?

时间:2010-11-09 03:24:37

标签: c++ c puzzle

最近我遇到了这个难题:

 int main(){
     int arr[7];
     int b,c,d,a;
     a=4;
     printf("%d",arr[?]);
   return 0;
}

问题是替换“?”用一个整数使输出为4. 我不确定,但我不认为这是以标准的方式解决的? (不调用未定义的行为或取决于实现)如果否,那么我对知道如何非常感兴趣?

修改:此任务取自here,我试图用10来解决,但遗憾的是这不是问题设定者想要的答案。但是,我solved它使用一些预先测试的实现依赖mumbo-jumbo,但我真的没有解释它是如何工作的!

以下是答案:SPOILER,欢迎您解释

7 个答案:

答案 0 :(得分:15)

在大多数实现中,arr[10](或7)将为4,因为本地将按顺序排列。

但是,这既不是既定的也不是标准的,不得依赖。

答案 1 :(得分:14)

假设没有符合标准的答案,你能使用像arr [& a-arr]这样的操作(显然不是整数)吗?

编辑:感谢Ben和其他人在评论中做得更清洁。

答案 2 :(得分:3)

我怀疑在一些系统上10会做的伎俩(取决于对齐和填充,以及int的大小),但这是未定义的行为。我看不出任何标准方式来做所谓的问题。

答案 3 :(得分:1)

on http://ideone.com

#include "stdio.h" 
int main(){
     int arr[7];
     int b,c,d,a;
     a=4;
     printf("%p %p %d %d",arr, &a, arr - &a, arr[7]);
   return 0;
}

0xbfa95918 0xbfa95934 -7 4

优化器删除b,c,d因此在7

处右移

答案 4 :(得分:0)

也许这是一个技巧问题,也许有一个4,但它在数组中不存在(所以也许一些奇怪的索引会给你一个有趣的原因4)。

答案 5 :(得分:0)

如果?需要用整数替换,我认为不可能有一个可移植的答案;但如果允许表达,则可以使用便携式解决方案;使用a [i] == i [a]

这一事实
 printf("%d",arr[(unsigned long) ((a & (1 << ((sizeof (int) - 1) * CHAR_BIT))) ?
                                 /* Big Endian */
                                 memset (calloc ((unsigned long) arr + sizeof (int), 1),
                                         4, (unsigned long) arr + 1)
                                 :
                                 /* Small Endian*/
                                 memset (memset (malloc ((unsigned long) arr + sizeof (int)),
                                                 4, (unsigned long) arr + sizeof (int)),
                                         0,
                                         (unsigned long) arr + sizeof (int) - 1)
                                 )]);

你需要大量的RAM来工作;我出于同样的原因无法测试正确性。

答案 6 :(得分:0)

$ cat 4130250.c \
> && echo -------- \
> && sed -e 's/\?/arr[0] = 4, 0/' 4130250.c | gcc -xc - \
> && ./a.out
int main(){
int arr[7],b,c,d,a;
a=4;
printf("%d\n", arr[?]);
return 0;
}
--------
<stdin>: In function `main`:
<stdin>:4: warning: incompatible implicit declaration of built-in function `printf`
4

命令行说明: - )

cat 4130250.c:输出“程序”的内容
echo --------:输出分隔符
sed ...:替换“?”用“arr [0] = 4,0”写入标准输出
| gcc -xc -:从标准输入编译C(前一个sed的输出)
./a.out:运行生成的二进制文件