Re: about arrays initialization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Dear Bob plantz:
I am sorry for reply your mail so late. Yes, I see why it is done twice too. Thank you for your reminder.

   I think I have got the answer. May god bless you and your family.


于 2011/8/28 下午 11:40, Bob Plantz 写道:
Ah, yes, I missed the i=0 statement. And now I see why it is done twice.
Your code sets i=0 twice:

int i = 0;
and
for (i=0;....

The order of assigning values to the elements of the array makes sense,
but it's not part of the C language standard. I would not be surprised
if some other C compiler does as you suggest with this code. But to
ensure that your code is portable, you need to do (notice my comment to
help the maintenance programmer):
===============================================
#include <stdio.h>
int main()
{
int a[5]={1, 2, 3};
int i;
// Finish initializing array
a[3] = a[2];
a[4] = a[0] + a[1];

for (i=0; i<5; i++) {
printf("\t%d\n", a[i]);
}
return 0;
}
===============================================

By the way, it is my personal programming philosophy that one should NOT
do arithmetic operations during variable initialization.

Also, I like to use symbolic names and #defines. Again, it helps the
maintenance programmer. (I have found that this is often me, a few weeks
later.) So the above code might become something like (depending on what
the numbers actually represent):
===============================================
#define nCats 1
#define nDogs 2
#define nBirds 3
#define nWinged nBirds
#define nFourLegged nCats+nDogs

#include <stdio.h>
int main()
{
int myCreatures[5]={nCats, nDogs, nBirds, nWinged, nFourLegged};
int i;

for (i=0; i<5; i++) {
printf("\t%d\n", myCreatures[i]);
}
return 0;
}
===============================================



On 08/28/2011 12:53 AM, uulinux wrote:
Dear Bob plantz:

Thank you very mach. You are very enthusiastic and friendly, and your
analysis is very good. The C code is as following:
===============================================
#include <stdio.h>
int main()
{
int a[5]={1, 2, 3, a[2], a[0]+a[1]};
int i=0;

for (i=0; i<5; i++) {
printf("\t%d", a[i]);
}
return 0;
}
===============================================
So, please read the following again.
>> movl %eax, 36(%esp) # a[3] = a[2] (previously computed above]
>> movl %edx, 40(%esp) # a[4] = a[0] + a[1] (previously computed above]
>> movl $0, 44(%esp) # a[5] = 0
>> movl $0, 44(%esp) # a[5] = 0
> # I have no idea why 0 is stored beyond the end of the array or why
it is done twice. But the assignment to the elements of the array
occur as I have always expected in C.
It is not a[5] = 0. It is i=0; But I also have no idea about why it is
done twice.

I have known the reason of this issue is "a[3], a[4]" has not
evaluated before the assignment occurred. So the result of this action
is not fixed? And the result of this action is determined by the
compiler. But there is still a question in my head. Why gcc put
"a[3]=a[2]; a[4]=a[0]+a[1];" operation in the front of "a[0]=1;
a[1]=2; a[2]=3;"? Is not the array has initialized from a[0] to a[n]?
I just wonder why not put "a[0]=1; a[1]=2; a[2]=3;" operation in the
front of "a[3]=a[2]; a[4]=a[0]+a[1];".

Is there a method to achieve “a[3] = a[2]; a[4]=a[0]+a[1]” for global
variable. So, I just need to update the value of a[0]…a[1] when the
value should be changed. I think it is useful when the arithmetic
expression is very complex. The value of some elements in a array will
be auto updated by compiler, just like this:
===============================================
static int a[6]={1, 2, 3, a[2], a[0]+a[1], sin(a[4])}; // gcc-4.4.5
report error !

#include <stdio.h>
int main()
{
int i=0;

for (i=0; i<6; i++) {
printf("\t%d", a[i]);
}
return 0;
}
===============================================



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux