简体   繁体   中英

C C++ array… need help understanding code

Can you please explain this code? It seems a little confusing to me Is "a" a double array? I would think it's just an integer, but then in the cout statement it's used as a double array. Also in the for loop condition it says a<3[b]/3-3, it makes no sense to me, however the code compiles and runs. i'm just having trouble understanding it, it seems syntactically incorrect to me

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

Array accessors are almost syntactic sugar for pointer arithmetic. a[b] is equivalent to b[a] is equivalent to *(a+b) .

That said, using index[array] rather than array[index] is utterly horrible and you should never use it.

Wow. This is really funky. This isn't really 2 dimensional array. it works because c is an array and there is an identity in the C language that treats this

b[3]

as the same as this

3[b]

so this code translates into a loop that increments a while a < (24/3-3) since 3[b] is the same as b[3] and b[3] is 24. Then it uses a[b] (which is the same as b[a] ) as an index into the array c.

so, un-obfuscated this code is

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]];
}

which is broken since b[4] doesn't exist, so the output should be the 3rd, 5th, 6th and 24th characters of the string c or

sco?

followed by some random character or a crash.

No, two variables are declared in the first statement: int a and int b[] .

a[b][c] is just a tricky way of saying c[b[a]] , that is because of the syntax for arrays: b[0] and 0[b] are equivalent.

int a,b[]={3,6,5,24};

Declares two variables, an int a and an array of ints b

char c[]="This code is really easy?";

Declares an array of char with the given string

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

Iterates a through the range [0..4]:

  • 3[b] is another way of saying b[3], which is 24.
  • 24 / 3 = 8
  • 8 - 3 = 5

cout << a[b][c];

This outputs the following result:

  • a[b] is equivalent to b[a], which will be b[0..4]
  • b[0..4][c] is another way of saying c[b[0..4]]

Well there is a simple trick in the code. a[3] is exactly the same as 3[a] for c compiler.

After knowing this your code can be transformed into more meaningful:

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]];
}

a<3[b]/3-3 is the same as writing

a < b[3]/3-3

and a[b] is the same is b[a] since a is an integer sp b[a] is one of the items from {3,6,5,24}

which then means a[b][c] is b[a][c] which is either c[{3,6,5,24}]

foo[bar] "expands" to "*(foo + bar)" in C. So a[b] is actually the same as b[a] (because addition is commutative), meaning the ath element of the array b. And a[b][c] is the same as c[b[a]] ie the ith char in c where i is the ath element in b.

Okay - first, let's tackle the for loop.

When you write b[3] , this is equivelent to *(b+3) . *(b+3) is also equivelent to *(3+b) , which can be written as 3[b] . This basically can be rewritten, more understandably, as:

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

Since b[3] is a constant value (24), you can see this as:

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

or

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

and finally:

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

In your case, this will make a iterate from 0-4. You then output a[b][c] , which can be rewritten as c[b[a]].

However, I don't see how this compiles and runs correctly, since it's accessing c[b[4]] - and b only has 4 elements. This, as written, is buggy.

First: 'a' is not initialized. Let's assume that it is initialized to 0.

'3[b]/3-3' equals 5. The loop will go from 0 to 4 using 'a'. ('3[b]' is 'b[3]')

In the a==4 step 'a[b]' (so 'b[a]') will be out of bounds (bounds of 'b' is 0..3) so it has undefined behavior. On my computer somethimes 'Segmentation fault' sometimes not. Until that point it outputs: "soc?"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM