Coincidentally, I just wrote that part of my own programming language last night, so unfortunately I already covered this on my own too (but did forget to ask it).
It is luck that I have actually written a C compiler, and have been forced to examine the results of all the questions posted here, including this one.
IF THE CONDITIONAL EXPRESSION WAS NOT CONSTANT:
As per the ANSI C++ standard, both values will be promoted based off the same rules that are used when and int and a double are multiplied, added, subtracted, etc.
If either operand is a double, both are promoted to doubles.
If either are floats, both become floats.
If either is an unsigned long, both become unsigned longs.
If either is an unsigned int, both become unsigned ints.
Finally, if none of the above has yet been matched, both sides become regular ints.
This changes per compiler based on sizes of int, etc., and whether or not int64 is supported, but in all cases double takes the cake.
Thus, the result of the expression would be a double in this case, then cast to whatever type is being assigned by this expression.
BUT SINCE THE CONDITIONAL EXPRESSION IS CONSTANT (1 is always less than 2):
The result will be an int. The conditional expression and the third operand (4.0) will be completely ignored, and the expression is exactly equivalent to just typing “3†in the code instead.