C++ C++;阵列。。。。需要帮助理解代码吗

C++ C++;阵列。。。。需要帮助理解代码吗,c++,loops,C++,Loops,你能解释一下这个代码吗?我觉得有点困惑 “a”是双数组吗?我认为它只是一个整数,但在cout语句中,它被用作双数组。同样在for循环条件下,它表示aNo,在第一条语句中声明了两个变量:inta和intb[] a[b][c]只是说c[b[a]的一种巧妙方式,这是因为数组的语法:b[0]和0[b]是等价的。数组访问器几乎是指针算法的语法糖a[b]相当于b[a]相当于*(a+b) 也就是说,使用index[array]而不是array[index]是非常可怕的,你不应该使用它。代码中有一个简单的技巧a

你能解释一下这个代码吗?我觉得有点困惑
“a”是双数组吗?我认为它只是一个整数,但在cout语句中,它被用作双数组。同样在for循环条件下,它表示aNo,在第一条语句中声明了两个变量:
inta
intb[]


a[b][c]
只是说
c[b[a]
的一种巧妙方式,这是因为数组的语法:
b[0]
0[b]
是等价的。

数组访问器几乎是指针算法的语法糖
a[b]
相当于
b[a]
相当于
*(a+b)


也就是说,使用
index[array]
而不是
array[index]
是非常可怕的,你不应该使用它。

代码中有一个简单的技巧
a[3]
与c编译器的
3[a]
完全相同

了解这一点后,您的代码可以转换为更有意义的代码:

int a,b[]={3,6,5,24};
char c[]="This code is really easy?";
for(a=0;a<b[3]/3-3;a++)
{
cout<<c[b[a]];
}
inta,b[]={3,6,5,24};
char c[]=“这段代码真的很简单吗?”;
for(a=0;aafoo[bar]“扩展”到C中的“*(foo+bar)”。因此
a[b]
实际上与
b[a]
相同(因为加法是可交换的),这意味着数组b的ath元素。
a[b][C]
C[b[a]
相同,即C中的第i个字符,其中i是b中的ath元素

int a,b[]={3,6,5,24};
声明两个变量,一个int a和一个int b数组

char c[]="This code is really easy?";
声明具有给定字符串的字符数组

for(a=0;a<3[b]/3-3;a++)

for(a=0;a好的-首先,让我们处理for循环

当你写
b[3]
时,这相当于
*(b+3)
*(b+3)
也相当于
*(3+b)
,可以写成
3[b]
。这基本上可以重写,更容易理解,如下所示:

for(a=0; a < ((b[3]/3) - 3); a++) 
for(a=0;a<((b[3]/3)-3);a++)
由于b[3]是一个常量值(24),您可以将其视为:

for(a=0; a < ((24/3) - 3); a++) 
for(a=0;a<((24/3)-3);a++)

for(a=0;a<(8-3);a++)
最后:

for(a=0; a < 5; a++) 
(a=0;a<5;a++)的

在您的情况下,这将使
a
从0-4进行迭代。然后输出
a[b][c]
,可以将其重写为c[b[a]]


但是,我看不出它是如何正确编译和运行的,因为它正在访问
c[b[4]]
-而b只有4个元素。正如所写的那样,这是有缺陷的。

哇。这真的很时髦。这不是真正的二维数组。它工作的原因是
c
是一个数组,在c语言中有一个标识来处理这个问题

b[3]
和这个一样

3[b]
因此,这个代码转换成一个循环,在
a<(24/3-3)
时增加a,因为
3[b]
b[3]
相同,而b[3]是24。然后它使用
a[b]
(与
b[a]
相同)作为数组c的索引

因此,未混淆的代码是

int a;
int b[] = {3,5,6,24}
char c[] = "This code is really easy?";
for (a = 0; a < 5; a++)
{
    cout << c[b[a]];
}

后跟一些随机字符或崩溃。

首先:“a”未初始化。假设它已初始化为0

“3[b]/3-3”等于5。循环将使用“a”从0变为4。(3[b]'是“b[3]”)


在a==4的步骤中,“a[b]”(因此“b[a]”)将超出范围(“b”的范围为0..3),因此它具有未定义的行为。在我的计算机上,有时“分段错误”不会。在这一点之前,它会输出:“soc?”

编写代码的人都应该被解雇……这正是你编写代码时不应该做的。@Reed:我怀疑这是故意做的。看起来像是一项测试学生涉过语法能力的作业……也就是说,从技术上来说,它也有问题,因为它要访问b[4],(因为a迭代时,这显然不是C,除非在此代码之外的某个地方定义了一个
cout
整数。@dreamlax:必须引用:“我看到'cout'被向左移动了“Hello world”几次,然后停在那里。”它不是C[0..4],它应该是C[b[0..4]]我的错。我过去经常就地或尽可能晚地声明和初始化循环变量,所以我想不起来了。:-)我想这是我第一次看到有人说为什么a[b]和b[a]是等价的……现在有人指出这一点似乎非常明显,但看到它写为*(a+b)在多年的C代码编写之后,语法终于清晰了。@Tanzelax-许多C文本(任何好的文本都应该如此)都指出了这种等价性。这是“[]”运算符的定义。它在Harbison&Steele和C标准(以及Plauger的“标准C库”)中都有几乎是我所指的唯一的C文本——C++仍然需要大量文本,不幸的是)@阿努:有一次我在宏中使用<代码>索引[SARD] [/COD]表格,以获得数组中元素的数量。窗体防止表达式在C++类中意外地工作,它会重载“<代码> []/COD>”运算符(当然,它是一种非常专业化的用法)。例如,在数组大小宏中,请参见这个答案:@米迦勒:是的,我已经单独看到了[b]**(a+b)(如你所说,它几乎在每个C文本中),并且[a]= B[A],但由于某种原因,这两个比特从来没有连接过。我知道。我不知道3 [B]和B(3)一样…好,我现在知道它是如何工作的。谢谢。总之,数组下标是C中的交换。注意,在所有C++变体中(例如,Visual C++),情况并非如此。
b[3]
3[b]
int a;
int b[] = {3,5,6,24}
char c[] = "This code is really easy?";
for (a = 0; a < 5; a++)
{
    cout << c[b[a]];
}
sco?