sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1; the result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined.
ISO/IEC 9899:1999 §6.5.3.4:
[sizeof]
3. When applied to an operand that has type char, unsigned char, or signed char, (or a qualified version thereof) the result is 1. [...]
4. The value of the result is implementation-defined [...]
Even if a given compiler gives a certain output you can't say that that is the output of the program
It is also asking about the value of i, which can be anything, because the consequences of the statement are undefined. More on this here: http://www.cplusplus.com/forum/general/23499/
Even though the expression (++i + ++i) has an undefined value, I think we can guarantee that i will be incremented exactly twice. So I think that i can be said to have the value 5 after the expression of undefined value completes.
EDIT: Actually I think that's what Athar just said.
[edit] No, that's not what he said. He said that the expression is "not evaluated".
[edit] Also, if it were evaluated, we cannot guarantee anything about i's value after the expression is evaluated, because said expression is undefined.
Since the expression in sizeof is not evaluated, the value of i is defined in this case.
Oh, no I got you now. The expression in sizeof() is literally not processed. Very interesting.
EDIT: I agree that the expression is undefined, but that is because we don't know when i will be incremented. But surely we do know that i will be incremented twice? (at least if it was not within a sizeof() directive).