用C ++进行类型转换:为什么使用(类型)表达式而不是类型(表达式)

时间:2016-07-16 22:21:01

标签: c++ casting

在python中,类型转换完成如下: float(a)如果变量a是一个整数,需要转换为float。

现在考虑以下C ++代码:

int a=5;
int b=10;
cout<< (float) a/b<<endl;
cout<<static_cast<float> (a/b)<<endl;
cout<<static_cast<float> (a)/b;

给出输出:

0.5

0

0.5

在第一个类型转换中,a是显式浮动的类型,然后b是隐式类型转换的类型。最终答案是float类型。

在第二次和第三次类型转换中,取决于()的位置,a首先显式转换为float,然后b隐式转换,然后最终值为0.5 a/b首先计算为int,然后输入caste为float,使最终值为0.

使用static_cast<type>(expr)

时没有歧义

我的问题是:

如果第一行写成:

,那么这不会更清楚吗?

cout<<float(a)/b<<endl;

消除关于将在何种顺序进行类型转换的任何歧义?

C ++没有限制这样做,但它不是常见的做法。相反,cout<<(int)a/b<<endl;是预先形成的形式,似乎更模糊。

为什么会这样?

构建此问​​题的另一种方法是:(type) expression提供的优势超过type (expression)

2 个答案:

答案 0 :(得分:2)

(type)a优于type(a)的主要优势在于,第一个适用于任何类型而第二个适用于 unsigned long x = unsigned long(3.0); unsigned long *y = unsigned long *(0); 。尝试以下操作,您将引发编译器错误;

(float) a/b;
static_cast<float> (a/b);
static_cast<float> (a)/b;

除此之外,你的问题是基于一个完全错误的前提。与您的描述相反,您描述的任何表达的含义都没有歧义。

float)a/b

因为第二个与另外两个有不同的含义。在执行除法之前,static_cast<float>(a)/ba都会将float转换为static_cast<float>(a/b)float进行除法,然后将结果转换为a/b

您真正的问题是,您不了解a b intint类型cellForRowAtIndexPath生成// f(i, 0, 3) cout<<i; for(int i=0, L1=atoi(&"3"[0]), K=0<L1?1:-1, L=L1+("3"[sizeof("3")-2]=='='?K:0); i!=L; i+= K) cout<<i; // f(i, 3, =5) cout<<i; for(int i=3, L1=atoi(&"=5"[0]), K=3<L1?1:-1, L=L1+("=5"[sizeof("=5")-2]=='='?K:0); i!=L; i+= K) cout<<i; // f(i, 4, 2) cout<<i; for(int i=4, L1=atoi(&"2"[0]), K=4<L1?1:-1, L=L1+("2"[sizeof("2")-2]=='='?K:0); i!=L; i+= K) cout<<i; // f(i, 3, ) cout<<i; for(int i=3, L1=atoi(&""[0]), K=3<L1?1:-1, L=L1+(""[sizeof("")-2]=='='?K:0); i!=L; i+= K) cout<<i; 类型的结果{1}}。

我还建议不要把Python作为C ++应该如何处理这些事情的示例。 Python 2.x也在积分除法上产生了一个整数值的结果(虽然行为与C ++略有不同)。 Python 3.x引入了所谓的&#34; true division&#34;。在Python社区中有很多激烈的讨论。

答案 1 :(得分:1)

  

构建这个问题的另一种方法是:有什么优势呢?   (type) expression优惠超过type (expression)

实际上,他们差不多相同......

(type) expressionC-style cast

type (expression)也会施放,但对某些typesint*const char*等等有限制;另外,它还是类类型的构造函数调用。