Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this code behavior defined?

Tags:

c++

operators

What does the following code print to the console?

map<int,int> m; m[0] = m.size(); printf("%d", m[0]); 

Possible answers:

  1. The behavior of the code is not defined since it is not defined which statement m[0] or m.size() is being executed first by the compiler. So it could print 1 as well as 0.
  2. It prints 0 because the right hand side of the assignment operator is executed first.
  3. It prints 1 because the operator[] has the highest priority of the complete statement m[0] = m.size(). Because of this the following sequence of events occurs:

    • m[0] creates a new element in the map
    • m.size() gets called which is now 1
    • m[0] gets assigned the previously returned (by m.size()) 1
  4. The real answer?, which is unknown to me^^

like image 413
Woltan Avatar asked Mar 29 '11 11:03

Woltan


People also ask

What is the meaning of a code of behavior?

(kəʊd əv bɪˈheɪvjə ) the generally accepted rules governing how people behave.

What is code of conduct meaning?

A code of conduct is the most common policy within an organization. This policy lays out the company's principles, standards, and the moral and ethical expectations that employees and third parties are held to as they interact with the organization.


1 Answers

I believe it's unspecified whether 0 or 1 is stored in m[0], but it's not undefined behavior.

The LHS and the RHS can occur in either order, but they're both function calls, so they both have a sequence point at the start and end. There's no danger of the two of them, collectively, accessing the same object without an intervening sequence point.

The assignment is actual int assignment, not a function call with associated sequence points, since operator[] returns T&. That's briefly worrying, but it's not modifying an object that is accessed anywhere else in this statement, so that's safe too. It's accessed within operator[], of course, where it is initialized, but that occurs before the sequence point on return from operator[], so that's OK. If it wasn't, m[0] = 0; would be undefined too!

However, the order of evaluation of the operands of operator= is not specified by the standard, so the actual result of the call to size() might be 0 or 1 depending which order occurs.

The following would be undefined behavior, though. It doesn't make function calls and so there's nothing to prevent size being accessed (on the RHS) and modified (on the LHS) without an intervening sequence point:

int values[1]; int size = 0;  (++size, values[0] = 0) = size; /*     fake m[0]     */  /* fake m.size() */ 
like image 55
Steve Jessop Avatar answered Oct 08 '22 14:10

Steve Jessop