jaya
jaya

Reputation: 355

Is this undefined behavior in C/C++

int foo(int c){
    return c;
}

int main(void){
    int a=5,c;
    c = foo(--a) + a; 
}

Will it invoke undefined behavior in C/C++? I think no it won't.

After reading all the answers I can't figure out whether it is undefined behavior or unspecified behavior.

Upvotes: 4

Views: 393

Answers (5)

Erik
Erik

Reputation: 91320

Yes it's undefined behavior - a and foo(--a) can be evaluated in any order.

For further reference, see e.g. Sequence Point. There's a sequence point after the complete expression, and after evaluation of the argument to foo - but the order of evaluation of subexpressions is unspecified, per 5/4:

Except where noted, the order of evaluation of operands of individual operators and subexpressions of individual expressions, and the order in which side effects take place, is unspecified. Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined.

EDIT: As Prasoon points out, the behavior is unspecified due to the order of evaluation ... is unspecified., and becomes undefined due to the prior value shall be accessed only to determine the value to be stored

Upvotes: 16

Prasoon Saurav
Prasoon Saurav

Reputation: 92884

Even though the operands of + operator can be evaluated in either order the behaviour is undefined because it violates the 2nd rule

1) Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression.

2) Furthermore, the prior value shall be accessed only to determine the value to be stored.

The following is well defined

c = foo(a-1) + a ;

Read this FAQ entry for a better understanding of undefined behaviour and sequence points.

Upvotes: 3

Björn Pollex
Björn Pollex

Reputation: 76866

According to Wikipedia + is not a sequence point, so the order of evaluation is not fixed, hence you have undefined behavior.

Upvotes: 2

Hiren
Hiren

Reputation: 341

You will get warning for return type in main function else it is ok and c = 8 at the end of main().

Upvotes: -1

filmor
filmor

Reputation: 32278

You should read this, it will tell you that your code is undefined because + is not a sequence point and as such it is undefined whether f(--a) or a is evaluated first.

Upvotes: 5

Related Questions