C6.3.1.8标准的www.example.com部分说的是:- ---
许多运算子预期会有算术型别的算子,会以类似的方式进行转换并产生结果型别。目的是要判断算子和结果的通用真实的型。对于指定的算子,每个算子都会转换成型别,而不变更型别定义域,其Map的实型是通用实型。除非明确说明,普通真实的类型也是结果对应的实数类型,如果操作数相同,则其类型域为操作数的类型域,否则为复数。这种模式称为普通算术转换:
我不理解的是“除非明确说明,否则公共真实的类型也是结果的对应实类型,如果操作数相同,则其类型域是操作数的类型域,否则为复数”这一部分。
这意味着,例如,如果我有这样一行代码:f=x+y;
其中x
是双精度型,y
是复数浮点型,f
是长双精度型
所以C标准的语句说,在这个例子中,结果对应的真实的类型是double,如果是这样,那么x保持为double,y被转换为复数double,最后结果被转换为long double,赋值给f,对吗?
如果我说错了,你能给予个例子说明这句话的意思吗?
1条答案
按热度按时间4uqofj5v1#
转换规则实际上适用于每个单独的运算符,而不是整个表达式。
首先有
x+y
,其中x
是double
,y
是float complex
,公共真实的类型是double
,所以x
的值仍然是double
类型,而y
的值被转换为double complex
,所以得到的表达式x+y
的类型是double complex
。然后是
=
运算符,整个左操作数f
的类型为long double
,右操作数x+y
的类型为double complex
。该运算符不服从通常的算术转换。第6.5.15.1p2节规定:在 * 简单赋值 *(
=
)中,右操作数的值转换为赋值表达式的类型,并替换左操作数指定的对象中存储的值。因此,
x+y
的值根据此规则从double complex
转换为long double
,并分配给f
。如果f
的类型为float
,则您将进行从double complex
到float
的转换。