Evaluation Order in Function Declaration

S

Shao Miller

Is the evaluation order guaranteed to be left-to-right for the
declaration of 'baz' in the following code? Or are the array size
expressions unsequenced relative to one another, as in 'a + b'? Or
something else?

#include <stdio.h>

int foo(void) { puts("foo"); return 1; }
int bar(void) { puts("bar"); return 1; }

int baz(int (* x)[foo()], int (* y)[bar()]) { return 0; }

int main(void) { return baz(0, 0); }
 
J

Jens Gustedt

Hello,

Am 02/28/2012 06:22 AM, schrieb Shao Miller:
Is the evaluation order guaranteed to be left-to-right for the
declaration of 'baz' in the following code? Or are the array size
expressions unsequenced relative to one another, as in 'a + b'? Or
something else?

#include <stdio.h>

int foo(void) { puts("foo"); return 1; }
int bar(void) { puts("bar"); return 1; }

int baz(int (* x)[foo()], int (* y)[bar()]) { return 0; }

int main(void) { return baz(0, 0); }

Yes, not only that it is left to right, you are even allowed to use each
of the preceding identifiers in the expressions. Otherwise things like

double sum(size_t n, size_t m, double A[n][m]) { ... }

could never work reliably.

Jens
 
K

Kaz Kylheku

Hello,

Am 02/28/2012 06:22 AM, schrieb Shao Miller:
Is the evaluation order guaranteed to be left-to-right for the
declaration of 'baz' in the following code? Or are the array size
expressions unsequenced relative to one another, as in 'a + b'? Or
something else?

#include <stdio.h>

int foo(void) { puts("foo"); return 1; }
int bar(void) { puts("bar"); return 1; }

int baz(int (* x)[foo()], int (* y)[bar()]) { return 0; }

int main(void) { return baz(0, 0); }

Yes, not only that it is left to right, you are even allowed to use each
of the preceding identifiers in the expressions. Otherwise things like

double sum(size_t n, size_t m, double A[n][m]) { ... }

could never work reliably.

Sure they could. The above could mean that A[n][m], n and m independently
receive values from the same sources (the argument expressions). The [n][m]
doesn't have to refer to the values stored in the parameters n, and m
but rather the [n][m] can indicate additional sinks for the data flows
emanating from argument 1 and 2.

Such semantics can be hammered out. There is no end to how you can lay weasely
traps for the programmer (as the sordid history of this language shows.)
 
J

Jens Gustedt

Am 02/28/2012 10:31 AM, schrieb Kaz Kylheku:
Hello,

Am 02/28/2012 06:22 AM, schrieb Shao Miller:
Is the evaluation order guaranteed to be left-to-right for the
declaration of 'baz' in the following code? Or are the array size
expressions unsequenced relative to one another, as in 'a + b'? Or
something else?

#include <stdio.h>

int foo(void) { puts("foo"); return 1; }
int bar(void) { puts("bar"); return 1; }

int baz(int (* x)[foo()], int (* y)[bar()]) { return 0; }

int main(void) { return baz(0, 0); }

Yes, not only that it is left to right, you are even allowed to use each
of the preceding identifiers in the expressions. Otherwise things like

double sum(size_t n, size_t m, double A[n][m]) { ... }

could never work reliably.

Sure they could. The above could mean that A[n][m], n and m independently
receive values from the same sources (the argument expressions). The [n][m]
doesn't have to refer to the values stored in the parameters n, and m
but rather the [n][m] can indicate additional sinks for the data flows
emanating from argument 1 and 2.

theoretically they could. pratically the standard says that the
identifier n for example is visible for the declaration of A
Such semantics can be hammered out. There is no end to how you can lay weasely
traps for the programmer (as the sordid history of this language shows.)

sure, I just don't see how your comment is related to the question
Shao had and how with any respect it would be helpful. You seem to
find it necessary to rant against VLA in any form you see them. Not
very helpful for anybody, probably not even for yourself.

Jens
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,902
Latest member
Elena68X5

Latest Threads

Top