C++ C++;-指针和数组 的问题。 #include <stdlib.h> #include <stdio.h> int main(int argc, char * argv[]) { int a[5] = {1,7,-1,0,2}; int b[5] = {7,5,3,4,2}; int c[5] = {1,4,5,3,1}; *(&a[2] + (&c[5] - 7 - &c[0]))= a[1]; *(&a[3] + (&c[5] - 7 - &c[0]))= b[1]; *(&a[4] + (&c[5] - 7 - &c[0]))= c[1]; int x = a[0] - a[1] + a[2] - a[3]; printf ("%d", x); return 0; } #包括 #包括 int main(int argc,char*argv[]) { int a[5]={1,7,-1,0,2}; int b[5]={7,5,3,4,2}; int c[5]={1,4,5,3,1}; *(&a[2]+(&c[5]-7-&c[0])=a[1]; *(&a[3]+(&c[5]-7-&c[0])=b[1]; *(&a[4]+(&c[5]-7-&c[0])=c[1]; intx=a[0]-a[1]+a[2]-a[3]; printf(“%d”,x); 返回0; }

C++ C++;-指针和数组 的问题。 #include <stdlib.h> #include <stdio.h> int main(int argc, char * argv[]) { int a[5] = {1,7,-1,0,2}; int b[5] = {7,5,3,4,2}; int c[5] = {1,4,5,3,1}; *(&a[2] + (&c[5] - 7 - &c[0]))= a[1]; *(&a[3] + (&c[5] - 7 - &c[0]))= b[1]; *(&a[4] + (&c[5] - 7 - &c[0]))= c[1]; int x = a[0] - a[1] + a[2] - a[3]; printf ("%d", x); return 0; } #包括 #包括 int main(int argc,char*argv[]) { int a[5]={1,7,-1,0,2}; int b[5]={7,5,3,4,2}; int c[5]={1,4,5,3,1}; *(&a[2]+(&c[5]-7-&c[0])=a[1]; *(&a[3]+(&c[5]-7-&c[0])=b[1]; *(&a[4]+(&c[5]-7-&c[0])=c[1]; intx=a[0]-a[1]+a[2]-a[3]; printf(“%d”,x); 返回0; },c++,arrays,pointers,C++,Arrays,Pointers,为什么x=6?thx答案是,您的操作在逻辑上意味着它/您在某处调用未定义的行为 但真正的答案是没有人编写这样的代码 如果你在面试中发现了这一点,那就叫他们虚张声势,开怀大笑。如果他们是认真的,就离开 如果你在真实的代码中发现了这一点,请在DailyWTF中发布。那就拒绝碰它 从以下内容开始: *(&a[2] + (&c[5] - 7 - &c[0]))= a[1]; 首先,我们注意到子表达式(&c[5]-7-&c[0])被多次使用。 (&c[5]-7-&c[0])可以

为什么x=6?thx

答案是,您的操作在逻辑上意味着它/您在某处调用未定义的行为

但真正的答案是没有人编写这样的代码

  • 如果你在面试中发现了这一点,那就叫他们虚张声势,开怀大笑。如果他们是认真的,就离开
  • 如果你在真实的代码中发现了这一点,请在DailyWTF中发布。那就拒绝碰它
从以下内容开始:

*(&a[2] + (&c[5] - 7 - &c[0]))= a[1];
首先,我们注意到子表达式
(&c[5]-7-&c[0])
被多次使用。
(&c[5]-7-&c[0])
可以重新排列为
(&c[5]-c[0]-7)
,它是
c
的第五个int的地址,减去
c
的第0个int的地址,这导致
5
*,因此表达式是
(5-7)
-2

(&a[2]-2)
是第二个索引减去2的地址,与
&a[0]
相同。所以
*(&a[2]+(&c[5]-7-&c[0])
a[0]

通过外推,代码的其余部分如下所示:

              //a is {1,7,-1,0,2};
a[0] = a[1];  //a is {7,7,-1,0,2};
a[1] = b[1];  //a is {7,5,-1,0,2};
a[2] = c[1];  //a is {7,5, 4,0,2};
然后我们得到最后一个等式:

int x = a[0] - a[1] + a[2] - a[3];
当我们在数组的这些位置找到值时:

int x = 7 - 5 + 4 - 0;
这将导致
6


*地址实际上并不是相隔5个(它们通常是20或40个),但是当你减去
int
指针时,它们之间的
int
s的数量是5个。

间接运算符&用来指代变量的地址

运算符*可用于引用目标

操作员&

int c : variable integer
&c : memory address of the variable
操作员*

int *c : pointer to an integer variable
*c: content pointed to by c
结果6是以下各项的乘积:

(&c[5] - 7 - &c[0])  is always equal to -2, 

*(&a[2] + (&c[5] - 7 - &c[0]))= a[1];  // a[0]=a[1]  
*(&a[3] + (&c[5] - 7 - &c[0]))= b[1];  // a[1]=b[1]  
*(&a[4] + (&c[5] - 7 - &c[0]))= c[1];  // a[2]=c[1] 
结果

a[0]=7, a[1]=5, a[2]=4 and a[3]=0
6 = 7 - 5 + 4 -0

你的代码中没有
y
——我猜你的意思是
x
?这是作业还是面试问题?你想解决什么问题?这段代码是从哪里来的?你是在为一场模糊代码竞赛而写吗?@Ferry,你明白每一行都是做什么的吗?如果没有,请就您不懂的第一行向我们提问。如果是,那么你应该能够自己回答这个问题。这真的应该是一个评论。你说得很对,但这并没有回答问题。@DavidHeffernan你说得非常对,标记为CW.+1表示“呼叫他们的虚张声势并大笑”。在第五次查看此代码后,我想知道是否确实存在未定义的行为。有一种指针算法会导致负值,但我认为这不是UB。其余的看起来很奇怪,但定义明确。@MooingDuck我想你是对的+我不明白在94个观点中,到目前为止只有1个人投了你的赞成票。我认为说“(&c[5]-&c[0]-7)是c的第五个元素的地址,减去c的第0个元素的地址,即5”是不对的。这些都是指向int的指针,因此地址差异更有可能是您所说的4倍。幸运的是,C没有简单的地址差异。指针差异反而返回数组索引差异(基本上),因此差异仍然是您期望的5。由于本文的其余部分比较复杂,我最初决定忽略这一点。不过,我已经更正了措辞,并添加了一条旁白来解释。