1,若有以下定义,char a;int b;float c;double d;则表达式a*b+d-c值的类型为( )
3个回答
展开全部
double类型。“隐式类型转换”C++定义了一组内置的类型对象之间的标准转换,在必要时它们被编译器隐式的应用到对象上。
在算式转换保证了二元操作符,如加法或乘法的两个操作数被提升为共同的类型,然后再用它表示结果的类型。
扩展资料:
C编译的整个过程很复杂,大致可以分为以下四个阶段:
1、预处理阶段在该阶段主要完成对源代码的预处理工作,主要包括对宏定义指令,头文件包含指令,预定义指令和特殊字符的处理,如对宏定义的替换以及文件头中所包含的文件中预定义代码的替换等,总之这步主要完成一些替换工作,输出是同源文件含义相同但内容不同的文件。
2、编译、优化阶段编译就是将第一阶段处理得到的文件通过词法语法分析等转换为汇编语言。优化包括对中间代码的优化,如删除公共表达式,循环优化等;和对目标代码的生成进行的优化,如如何充分利用机器的寄存器存放有关变量的值,以减少内存访问次数。
展开全部
double
表达式的类型会自动提升为参与表达式求值的最上级类型
表达式的类型会自动提升为参与表达式求值的最上级类型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
答案:double类型
参考:“隐式类型转换”
C++定义了一组内置的类型对象之间的标准转换,在必要时它们被编译器隐式的应用到对象上。在算式转换保证了二元操作符,如加法或乘法的两个操作数被提升为共同的类型,然后再用它表示结果的类型。两个通用的指导原则如下:
1、为防止精度损失,如果必要的话,类型总是被提升为较宽的类型。
2、所有含有小于整形的有序类型的算术表达式在计算之前其类型都会被转换成整形。
规则的定义如上面所述,这些规则定义了一个类型转换层次结构,我们从最宽的类型long
double
开始,那么另一个操作数无论是什么类型都将被转换成long
double
.如果两个操作数千不是long
double
型,那么若其中一个操作数的类型是double
型,则另一个就被转换成double
型。例如:
int
ival;
float
fval;
double
dval;
dval
+
fval
+
ival
//在计算加法前fval和ival都被转换成double
类似地,如果两个操作数都不是double型而其中一个操作float型
,则另一个被转换成float型。例如:
char
cval;
int
ival;
float
fval;
cval
+
ival
+
fval
//在计算加法前ival和cval都被转换成float
否则如果两个操作数都不是3种浮点类型之一,它们一定是某种整值类型。在确定共同的目标提升类型之前,编译器将在所有小于int
的整值类型上施加一个被称为整值提升的过程。
在进行整值提升时类型char、signed
char、unsigned
char和short
int
都被提升为类型int
。如果机器上的类型空间足够表示所有unsigned
short
型的值,这通常发生在short用半个字而int
用一个字表示的情况下,则unsigned
short
int
也被转换成int
否则它会被提升为unsigned
int
。wchar_t和枚举类型被提升为能够表示其底层类型所有值的最小整数类型。在下列表达式中:
char
cval;
bool
found;
enum
mumber{m1,m2,m3}mval;
unsigned
long
ulong;
cval
+
ulong;ulong
+
found;
mval
+
ulong;
在确定两个操作数被提升的公共类型之前,cval
found
和mval都被提升为int
类型。
一旦整值提升执行完毕,类型比较就又一次开始。如果一个操作是unsigned
long
型,则第二个也被转换成unsigned
long
型。在上面的例子中所有被加到ulong上的3个对象都被提升为unsigned
long
型。如果两个操作类型都不是unsigned
long
而其中一个操作long型,则另一个也被转换成long型。例如:
char
cval;
long
lval;
cval
+
1024
+
lval;
//在计算加法前cval和1024都被提升为long型
。
long类型的一般转换有一个例外。如果一个操作long型而另一个是unsigned
int
型,那么只有机器上的long型的长度足以unsigned
int
的所有值时(一般来说,在32位操作系统中long型和int
型都用一长表示,所以不满足这里的假设条件),unsigned
int
才会被转换为long型,否则两个操作数都被提升为unsigned
long
型。若两个操作数都不是long型而其中一个是unsigned
int
型
,则另一个也被转换成unsigned
int
型,否则两个操作数一定都是int
型。
尽管算术转换的这些规则带给你的困惑可能多于启发,但是一般的思想是尽可能地保留类型表达式中涉及到的值的精度。这下是通过把不同的类型提升到当前出现的最宽的类型实
现的。
参考:“隐式类型转换”
C++定义了一组内置的类型对象之间的标准转换,在必要时它们被编译器隐式的应用到对象上。在算式转换保证了二元操作符,如加法或乘法的两个操作数被提升为共同的类型,然后再用它表示结果的类型。两个通用的指导原则如下:
1、为防止精度损失,如果必要的话,类型总是被提升为较宽的类型。
2、所有含有小于整形的有序类型的算术表达式在计算之前其类型都会被转换成整形。
规则的定义如上面所述,这些规则定义了一个类型转换层次结构,我们从最宽的类型long
double
开始,那么另一个操作数无论是什么类型都将被转换成long
double
.如果两个操作数千不是long
double
型,那么若其中一个操作数的类型是double
型,则另一个就被转换成double
型。例如:
int
ival;
float
fval;
double
dval;
dval
+
fval
+
ival
//在计算加法前fval和ival都被转换成double
类似地,如果两个操作数都不是double型而其中一个操作float型
,则另一个被转换成float型。例如:
char
cval;
int
ival;
float
fval;
cval
+
ival
+
fval
//在计算加法前ival和cval都被转换成float
否则如果两个操作数都不是3种浮点类型之一,它们一定是某种整值类型。在确定共同的目标提升类型之前,编译器将在所有小于int
的整值类型上施加一个被称为整值提升的过程。
在进行整值提升时类型char、signed
char、unsigned
char和short
int
都被提升为类型int
。如果机器上的类型空间足够表示所有unsigned
short
型的值,这通常发生在short用半个字而int
用一个字表示的情况下,则unsigned
short
int
也被转换成int
否则它会被提升为unsigned
int
。wchar_t和枚举类型被提升为能够表示其底层类型所有值的最小整数类型。在下列表达式中:
char
cval;
bool
found;
enum
mumber{m1,m2,m3}mval;
unsigned
long
ulong;
cval
+
ulong;ulong
+
found;
mval
+
ulong;
在确定两个操作数被提升的公共类型之前,cval
found
和mval都被提升为int
类型。
一旦整值提升执行完毕,类型比较就又一次开始。如果一个操作是unsigned
long
型,则第二个也被转换成unsigned
long
型。在上面的例子中所有被加到ulong上的3个对象都被提升为unsigned
long
型。如果两个操作类型都不是unsigned
long
而其中一个操作long型,则另一个也被转换成long型。例如:
char
cval;
long
lval;
cval
+
1024
+
lval;
//在计算加法前cval和1024都被提升为long型
。
long类型的一般转换有一个例外。如果一个操作long型而另一个是unsigned
int
型,那么只有机器上的long型的长度足以unsigned
int
的所有值时(一般来说,在32位操作系统中long型和int
型都用一长表示,所以不满足这里的假设条件),unsigned
int
才会被转换为long型,否则两个操作数都被提升为unsigned
long
型。若两个操作数都不是long型而其中一个是unsigned
int
型
,则另一个也被转换成unsigned
int
型,否则两个操作数一定都是int
型。
尽管算术转换的这些规则带给你的困惑可能多于启发,但是一般的思想是尽可能地保留类型表达式中涉及到的值的精度。这下是通过把不同的类型提升到当前出现的最宽的类型实
现的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询