0.5是int型.还是float型

titicacahang 2007-08-20 05:40:50
void funtion(int)
void funtion(float)
这二个函数的时候。。
如果是funtion(0.5)时。。
那么编译器。会不知道取其中那一个的
在看高质量C.C++时...发现这个问题
虽然考的是隐式转换的问题..

但是我一直都认为0.5就是float型的.所以就是到void funtion(float)里..
但是高质量c.c++说.这里他会不知道到底取个???(不懂了)
请大家帮忙..分析..解答...谢谢
...全文
1180 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝光芒 2007-08-21
  • 打赏
  • 举报
回复
牛人啊
ForestDB 2007-08-21
  • 打赏
  • 举报
回复
0.5 is double type.
ribut9225 2007-08-21
  • 打赏
  • 举报
回复
学习
星羽 2007-08-21
  • 打赏
  • 举报
回复
ambiguous call to overloaded function
jxlczjp77 2007-08-21
  • 打赏
  • 举报
回复
晕啊,我上面讲的有点问题,是这样
这个是定义:
================================
integral promotions:
整数类型提升是标准转换的一个子集,它将一个小的整数类型转提升为一个更大的整数类型。
================================
也就是A_B_C_ABC(黄瓜@YouCanDoIt)说的那个意思。



而这个是用来回答这个问题,整形提升用在函数类型匹配:
===================
其中所有比int小的整数类型如char, signed char, unsigned char, short, unsigned short,如果该类型所有的值都能被装到一个int里面则被转换为int,否则转换为unsigned int。

bool也是一个整数类型,所以也被转换为int,false转换为0, true转换为1
===================
jxlczjp77 2007-08-21
  • 打赏
  • 举报
回复
integral promotions:
整数类型提升是标准转换的一个子集,它将一个小的整数类型转提升为一个更大的整数类型。

其中所有比int小的整数类型如char, signed char, unsigned char, short, unsigned short,如果该类型所有的值都能被装到一个int里面则被转换为int,否则转换为unsigned int。

bool也是一个整数类型,所以也被转换为int,false转换为0, true转换为1
0黄瓜0 2007-08-21
  • 打赏
  • 举报
回复
类型提升指可以向一个方向自动转换,但反过来的转换是可能出差错的.比如char型可以转换为int型,int型可以转换为unsigned int型,但反过来可能造成数据丢失,编译器至少会给你一个警告. 当函数参数的匹配,两个都是向下转换,而不是提升则会出现不能决断(二义性)的错误.

char -> short -> int -> float -> double
| | |
|->unsigned char | |->unsigned int
|->unsigned short

loops 2007-08-21
  • 打赏
  • 举报
回复
类型提升是啥意思?
jxlczjp77 2007-08-21
  • 打赏
  • 举报
回复
==============================
楼上说的"而对于函数参数匹配,在同样需要转化的情况下,认为int转化最优
"该如何理解?
#include <iostream>

void fun(int) {}

void fun(float) {}

int main(int argc,char* argv[])
{
fun(0.5);
return 0;
}
可是有二义性错误的.
=======================
不好意思不好意思,太想当然了,这个确实有二义性。

C++ primer上关于参数匹配和转换应该是这个意思:
1. 精确匹配最优先
2. 通过类型提升次之
3. 通过标准转换匹配
4. 类类型转换

另外,没有任何一个标准转换比其他标准转换更好,而这里float到int为一个标准转换,而float到double也是一个标准转换,因此没有一个比另一个匹配更好,从而存在二义性。

基础还是不牢固啊,没有仔细看这一段,不过另一个例子是没有错的:
void f(unsigned short a);
void f(int a);

short m=0;
f(m);//会调用哪个f函数呢?答案是int版本
这里没有二义性,因为通过整型类型提升比标准转换有更好的匹配,short可以提升为int,也可以通过标准转换成为unsigned short,但Int是一个更好的匹配。

但是这样调用又会有二义性:
double m;
f(m); //二义性,没有一个标准转换比其他的标准转换更好

希望这次不会再错了,如果还有问题的话请指出,希望不要误导大家...
titicacahang 2007-08-21
  • 打赏
  • 举报
回复
谢谢大家的回复呀....想不到..竟然引起这么大的讨论..呵呵.
谢谢...现在知道了...
lkldiy 2007-08-21
  • 打赏
  • 举报
回复
double
iamliadai 2007-08-20
  • 打赏
  • 举报
回复
写出这样代码的人 ,估计早被公司开除了
a013231 2007-08-20
  • 打赏
  • 举报
回复
楼上说的"而对于函数参数匹配,在同样需要转化的情况下,认为int转化最优
"该如何理解?
#include <iostream>

void fun(int) {}

void fun(float) {}

int main(int argc,char* argv[])
{
fun(0.5);
return 0;
}
可是有二义性错误的.
jxlczjp77 2007-08-20
  • 打赏
  • 举报
回复
对于C++,整数字面值默认为int,浮点字面值默认为double
而对于函数参数匹配,在同样需要转化的情况下,认为int转化最优
void funtion(int)
void funtion(float)

function(0.5);
0.5是douoble型,而double既可以转化为int,又可转化为float,但默认为int匹配是最好的。

再来个更迷惑人的:
void f(unsigned short a);
void f(int a);

short m=0;
f(m);//会调用哪个f函数呢?

答案是void f(int a)这个版本,和上面同样的原因,因为short可以转化到unsigned short以及int,但认为int最优
a013231 2007-08-20
  • 打赏
  • 举报
回复
...
0.5是double型的呀.
或者要转成int型,或者要转成float型,所以不知道到底要取哪个.
titicacahang 2007-08-20
  • 打赏
  • 举报
回复
你的意思是
0.5如果在做参数时.会隐式转换成 float或是double??
0.5f时..这个已经是float类型了...
0.5转换成 int的解释呢??
我啃 2007-08-20
  • 打赏
  • 举报
回复
0.5->double
0.5f->float
6->int

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧