Sujet : Re: 80386 C compiler
De : tr.17687 (at) *nospam* z991.linuxsc.com (Tim Rentsch)
Groupes : comp.lang.cDate : 28. Nov 2024, 04:26:21
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <86v7w8ox7m.fsf@linuxsc.com>
References : 1 2 3 4 5 6
User-Agent : Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Kaz Kylheku <
643-408-1753@kylheku.com> writes:
On 2024-11-25, Rosario19 <Ros@invalid.invalid> wrote:
>
On Mon, 25 Nov 2024 18:23:58 -0000 (UTC), Kaz Kylheku wrote:
>
void fn(int a)
{
int x[3] = { foo(), bar(), a }; /* not in C90 */
>
is in the above foo() called before bar()?
>
No, you cannot rely on that. Maybe it's fixed in a more recent
standard, but C99 (which I happen to have open in a PDF reader
tab) stated that "The order in which any side effects occur among
the initialization list expressions is unspecified.". This
implies that there is no sequence point between any two
initializing expressions, which means we don't know whose
expression's function call takes place first.
Challenge exercise for C standard enthusiasts: It is possible
(in C99 and later) to write an initializer for x[] that puts
in the same values as the initializer above, but guarantees
foo() is called before bar(). Hint: nothing else is needed
besides a different writing of the initializer for x[] (still
an array of length 3). How to do it?