Keith Thompson said:
An expression *yields* a value. (I think earlier versions of the
standard used the word "return" for the results of expressions in
some places; as far as I know it's been cleaned up.)
I'd say that an expression /had/ a value (and that an /evaluation/
yielded a value). Let me try to find quotations in N1570:
»Its lifetime begins when the expression is evaluated
and its initial value is the value of the expression.«
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
»An actual implementation need not evaluate part of an
expression if it can deduce that its value is not used
and that no needed side effects are produced«
»the value of CHAR_MIN«
»expressions with implementation-defined values«
»Its lifetime begins when the expression is evaluated
and its initial value is the value of the expression.«
»If an expression of any other type is evaluated as a
void expression, its value or designator is discarded.«
The relationship between an expression and its value in all
these quotes (selected without bias) is always /possessive/,
hence /has/.
However, I'd like to add that for run-time values, it would
be more correct never to say that /an expression had/ a value,
since the value is in a one-to-one correspondence only with
a single /evaluation/, because each evaluation of an
expression may yield a different value. But it might be too
cumbersome to always write »the value of an evaluation of x«
instead of »the value of x«.