Question is easy. Answer is not easy. Why answer is 1? (C++) | Sololearn: Learn to code for FREE!
New course! Every coder should learn Generative AI!
Try a free lesson
+ 2

Question is easy. Answer is not easy. Why answer is 1? (C++)

#include <iostream> using namespace std; int main() { int arr[]={0-arr[1],1-arr[2],2}; int sum =arr[0]+arr[1]+arr[2]; cout<<sum; } Answer is 1.

7th Jan 2018, 9:03 PM
Jamol Makhsudov
Jamol Makhsudov - avatar
6 Answers
+ 7
I don't know what you expected from this code, but it's behavior is definately undefined. You're trying to use values of the array, that's being initialized with those values. So compiler is free to launch you to the moon or do any other random and unexpected thing. But, if you want a speculation on why the result is like that, here it is (all the charachters are entirely fictional, and so on): First of all, as the array is being initialized, the compiler defaults it's values to zeros — it's normal behavior, like with `int a[10] = {}; // Gets initialized to 0`. At least it may expect them to be 0. Then the compiler should evaluate the values in the initializer. There's no defined order of evaluation here. No right to left or left to right. As often is observed, gcc takes a "BFS" approach to unwind the "evaluation tree". So it goes like this: 1. {0-arr[1], 1-arr[2], 2} becomes: 2. {EVAL(0-arr[1]), EVAL(1-arr[2]), EVAL(2)} that becomes: 3. {EVAL(EVAL(0) - EVAL(arr[1])), EVAL(EVAL(1) - EVAL(arr[2])), 2} "2" gets evaluated first, as it's the shallowest in the evaluation tree. Anyway, this becomes: 4. {EVAL(0 - EVAL(arr[1])), EVAL(EVAL(1) - EVAL(arr[2])), 2} then: 5. {EVAL(0 - EVAL(arr[1])), EVAL(1 - EVAL(arr[2])), 2} and: 6. {EVAL(0 - 0), EVAL(1 - EVAL(arr[2])), 2} arr[1] is assumed to be zero, as if we're using initializetion, all the unitialized elements default to 0. Continuing: 7. {EVAL(0 - 0), EVAL(1 - 2), 2} "2" — because arr[2] is already known to be 2. Anyway: 8. {0, EVAL(1 - 2), 2} and: 9. {0, -1, 2} So, it gets initialized to {0, -1, 2}. But, according to the standard, the chances for this are the same as for getting few daemons fly out of your nose. So, I repeat, all this is pure speculation (though based on an observation).
7th Jan 2018, 11:19 PM
deFault
+ 2
I've seen gcc taking this evaluation order quite a few times, in case there was no order defined by the standard. Like in function parameters evaluation, or cin/cout chain. So, even though it's undefined, I kind'a expect this order from gcc. But the part where 'arr[1] is assumed to be zero' in step 6 — that's just my guess to fit the behavior to the result. Anyway, all this is UB, and it isn't supposed to be logical.
7th Jan 2018, 11:41 PM
deFault
+ 2
@kurwius, not afraid of nasal daemons? ;)
8th Jan 2018, 12:10 AM
deFault
+ 1
If I set: int arr[] = {arr[0], arr[1], arr[2]} And then It elements separated with a "," I get: 1960210976, -1663767622, -2 I don't know what are these numbers, maybe something with the memory. If I cout the elements of your array, It prints: 0 -1 2 , where the sum of them is 1. I hope this can help
7th Jan 2018, 9:12 PM
Sebastián Zapata
Sebastián Zapata - avatar
+ 1
@Marvin answer matches the values outputted, if you cout the array after the fact.
7th Jan 2018, 11:31 PM
John Wells
John Wells - avatar
+ 1
@marvin, Thanks for detail explanation.
8th Jan 2018, 4:27 AM
Jamol Makhsudov
Jamol Makhsudov - avatar