tags:

views:

105

answers:

4

a) How is an array type declaration new int[10][] evaluated? Is it evaluated

as (new int[10])[]

or as (new int[10][])

or …?

b) I’m not sure how to ask this: I know statement int[][] i = (new int[10])[] would give us compiler error. But assuming compiler wouldn’t report an error, what kind of array type would compiler create based on this statement?


EDITED:

I apologize for not being able to make my question more comprehensive. It’s one of those questions where something is bothering me and I’m not capable of crystallizing the question in my mind enough to make some sense of it. So I ask a half assed questions hoping that replies will help me with that. Anyways, it’s a pointless question but I would still like to explain what I’ve actually meant by it:

what prompted all of this was an article from MSDN where it said

Primary expressions are divided between array-creation-expressions and primary-no-array-creation-expressions. Treating array-creation-expression in this way, rather than listing it along with the other simple expression forms, enables the grammar to disallow potentially confusing code such as

object o = new int[3][1];

which would otherwise be interpreted as

object o = (new int[3])[1];

so that got me thinking that perhaps parenthesis around different parts of this array creation expression would give compiler different instructions on the type of array it should create.

Or to put it differently, I thought that perhaps compiler follows some build-in logic ( derived from some math field ) when interpreting array creation/initialization syntax. In other words, compiler didn’t build an array due to its developers giving it specific instruction such as “when you see words new and name of some type and two pairs of square brackets ([] []), then follow these step-by-step instructions , which will tell you in full details what to do", but instead developers just build in some math related logic and from that compiler was capable deriving an array by itself, without developers giving it step by step instructions.

BTW – I do understand about jagged and rectangular arrays and how they are initialized etc ;)

+4  A: 

This is an array of size ten with members of type integer array, also known as a jagged array.

See this section of the C# tutorial on MSDN (specifically the Jagged Array section).

Oded
I understand jagged arrays, I’m just curious how compiler evaluates array type declaration
AspOnMyNet
Well, that's not the question you asked...
Oded
+1  A: 

It would provide you with a vector with a width of 10 integer values and an indeterminate depth. The depth of each vector would be determined as each of the 10 indices is instantiated and populated.

Joel Etherton
+8  A: 

Here's my article on how this works and what the design considerations were. Hopefully that answers your questions.

http://blogs.msdn.com/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx

To attempt your specific questions:

How is an array type declaration "new int[10][]" evaluated?

That's not a type declaration. "class C {}" is a type declaration because it declares a new type. What you've got is an object creation expression.

It's evaluated by creating a new array with ten elements. Each element is a variable that can contain a reference to an array of integers. Each of those variables is initialized to null.

Is it evaluated as (new int[10])[] or as (new int[10][])

I don't understand the question. The former is not legal, and the latter is just the expression again in parentheses. So I guess the answer is that it is evaluated like the latter, since the two are the same, but I cannot help but think I'm missing the point of the question.

But assuming compiler wouldn’t report an error, what kind of array type would compiler create based on this statement?

If bishops were not restricted to moving on the diagonal, how would the queen's gambit play out differently?

The question does not provide enough information to answer the question. You have to say what the new rule for bishops is, not just what restriction is lifted. What would the new rule for bishops be? Once we know the new rule, then we can analyze how the game changes.

You haven't proposed what the specification would say, only what it would not say. That's not enough to determine the semantics of this proposed expression.

Eric Lippert
@Eric Lippert: Minor nitpick but in "What you've got is an object initialization expression." don't you mean "object creation expression" or maybe "array creation expression" or, to be ultra-pedantic, perhaps "array creation expression with the default array initializer"? Sorry.
Jason
@Eric Lippert: "Is it evaluated as `(new int[10])[]` or as `(new int[10][])` [...] "The former is not legal, and the latter is just the expression again in parentheses." Note there is a slight but important difference between the two. In the first there are parentheses around `new int[10]` (thus `(new int[10])[]`) but in the second there are no such parentheses; the second could have been written as `new int[10][]`. The former is indeed illegal and the second is just the repeating what he's asking about so I still don't understand his question.
Jason
@Jason: Yes. That was an error. As for the "what's the difference" question, I still don't understand the distinction that the OP is driving at.
Eric Lippert
@Eric Lippert: Agree; I didn't mean to imply that the clarification elucidated his question. I think you answered as I was editing my comment indicating such.
Jason
I've edited my post in order to try to explain what I've "meant"
AspOnMyNet
+2  A: 

I think I can help answer your question a little bit. At least, I think I understand what you don't understand and can babble about it cogently for a moment.

When the compiler sees

int[][] a = new int[10][];

what it does it creates a one-dimensional array of length ten. Each element in this array is capable of holding a reference to an int[]. It then assigns a reference to this one-dimensional array of length ten to a. Therefore, if you understand what

int[] a = new int[10];

does you should now be able to understand what

int[][] a = new int[10][];

does. The former reserves ten contiguous slots that can hold int. The latter reserves ten continugous slots that can hold references to int[]. (We are leaving out additional details such as the Length property, etc.) So, if you imagine a fantasy syntax ArrayCreate(Type type, int length) the former is

int[] a = ArrayCreate(typeof(int), 10);

and the latter is

int[][] a = ArrayCreate(typeof(int[]), 10);

Now, I don't really understand what you're asking in your two questions labeled "a)" and "b)". Perhaps you can rephrase them in terms of this fantastical ArrayCreate syntax and I can try to answer them?

I hope that helps.

Jason