最近我遇到了这个难题:
int main(){
int arr[7];
int b,c,d,a;
a=4;
printf("%d",arr[?]);
return 0;
}
问题是替换“?”用一个整数使输出为4. 我不确定,但我不认为这是以标准的方式解决的? (不调用未定义的行为或取决于实现)如果否,那么我对知道如何非常感兴趣?
修改:此任务取自here,我试图用10来解决,但遗憾的是这不是问题设定者想要的答案。但是,我solved它使用一些预先测试的实现依赖mumbo-jumbo,但我真的没有解释它是如何工作的!
以下是答案:SPOILER,欢迎您解释
答案 0 :(得分:15)
在大多数实现中,arr[10]
(或7)将为4,因为本地将按顺序排列。
但是,这既不是既定的也不是标准的,不得依赖。
答案 1 :(得分:14)
假设没有符合标准的答案,你能使用像arr [& a-arr]这样的操作(显然不是整数)吗?
编辑:感谢Ben和其他人在评论中做得更清洁。
答案 2 :(得分:3)
我怀疑在一些系统上10会做的伎俩(取决于对齐和填充,以及int
的大小),但这是未定义的行为。我看不出任何标准方式来做所谓的问题。
答案 3 :(得分:1)
#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
:运行生成的二进制文件