题
int main(){
int arr[2]={30,40};
printf("%dn",i[arr]);
return 0;
}
我在一次考试中发现了这个问题,给出的解决方案是 40
但我认为它应该给出一个错误,因为我是未定义的。或者,可能是我错过了什么。请解释我如何40是正确的答案?
先谢谢你。
解决方案
你是正确的,代码是错误的。很可能,这是一个错字,其目的是要么定义 i
或使用 1[arr]
.
其他提示
可能这是一个错误,因为 i
没有定义。
此外,这项工作的目的可能是利用以下事实: C, ,你可以写 v[ i ]
为了访问 #i 向量的元素 v, ,或 i[ v ]
.
这两种形式是等价的。自 v[ i ]
被翻译为 *( v + i )
, ,实际上与之没有任何区别 *( i + v )
, ,这是什么 i[ v ]
被翻译为。这不是一个常见的用途,但仍然是有效的。
在这个具体的例子中, 1[arr]
会返回预期的答案。
我只是想知道为什么他们选择了40而不是42。
希望这有帮助。
i
可能应该在考试的口语部分,或者在缺少的部分给出1。正如所写的,这个问题当然是不适用的,因为它没有编译。
问题的真正意义在于测试申请人是否理解 array[index]
相当于 index[array]
和(大概)为什么。
在C array[index] = *(array + index) = *(index + array) = index[array]
.假设 i
要成为 1
(否则行为未定义), 1[arr]
相当于 arr[1]
它包含了价值 40
.
嗯,让我们看看。..
matilda:~ jeremyp$ cat > foo.c
int main(){
int arr[2]={30,40};
printf("%dn",i[arr]);
return 0;
}
matilda:~ jeremyp$ cc foo.c
foo.c:4:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)'
printf("%dn",i[arr]);
^
foo.c:4:5: note: please include the header <stdio.h> or explicitly provide a declaration for 'printf'
foo.c:4:18: error: use of undeclared identifier 'i'
printf("%dn",i[arr]);
^
1 warning and 1 error generated.
确实如此, i
是未定义的。你要么需要
int i = 1;
在那份声明之前,或者它不是 i
, ,这是一个 1
.我们试试吧。..
matilda:~ jeremyp$ cat >foo.c
#include <stdio.h> // Stops the warning
int main(){
int arr[2]={30,40};
printf("%d\n",1[arr]); // Also added a \ so we get a line feed.
return 0;
}
matilda:~ jeremyp$ cc foo.c
matilda:~ jeremyp$ ./a.out
40
现在管用了。
不隶属于 StackOverflow