为什么甚至允许隐式强制转换?我的意思是铸造的利益float,以一个int隐含?显式强制转换是否会使代码更易读且更容易调试?
回答:是的,这是一个例子
#include <stdio.h>
int main()
{
unsigned int a=1;
int b=-1;
if(b>a)
printf("-1 > 1 \n");
else
printf("boring!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果执行此代码,您将获得
-1 > 1
Run Code Online (Sandbox Code Playgroud)
这是由于变量的隐式转换b(b将被强制转换为unsigned int并开启-1以4294976295比1大),这有时会使一个问题,所以这将是一个好习惯,使明确的转换,以把事情说清楚你和在同一项目上工作的程序员!
第一:C++中大量的隐式转换是由于历史原因造成的,没有别的原因。我认为没有人认为所有这些都是好主意。另一方面,有许多不同类型的隐式转换,其中一些对于语言来说几乎是必不可少的:如果您需要显式转换来将 a 传递给采用 ; 的MyType x;函数,您就不会喜欢它MyType const&。我非常确定,人们一致认为添加 const 的 const 转换(如本例)应该是隐式的。
对于尚未达成共识的转换:
几乎没有人对无损转换有任何疑问;事情喜欢int到long,或者float到double。大多数人似乎也接受从整型到浮点型的转换(例如
int到double),尽管在某些情况下这些可能会降低精度。(int i = 123456789; float f = i;, 例如。)
在 C++98 标准化过程中,有人提议弃用缩小转换,float例如int. (该提案的作者是 Stroustrup;如果您不喜欢这样的转换,那么您的公司很好。)它没有通过;我不知道到底为什么,但我怀疑这是一个过于打破 C 传统的问题。在 C++11 中,在一些较新的构造中禁止此类转换,例如新的初始化序列。因此,在我看来,人们一致认为这些隐式转换实际上并不是一个好主意,但由于担心破坏代码或可能只是破坏 C 中的传统,因此不能将它们删除。(我知道更多有些人不喜欢这样一个事实someString += 3.14159;:在字符串末尾添加 ETX 字符是合法的声明。)
最初的提案建议bool弃用所有数字和指针类型到bool. 该内容已被删除;if ( somePointer )很快人们就发现,如果该提案使诸如(而不是
if ( somePointer != NULL ))之类的事情变得非法,那么它就不会通过。仍然有很多人(包括我自己)认为这种转换“不好”,并避免它们。
最后:编译器可以随意发出任何它想要的警告。如果市场坚持对此类转换发出警告,编译器将实现它们(可能作为一种选择)。我怀疑他们不这样做的原因是警告的名声不好,因为最初的实现产生了太多的警告。整体促销会导致许多无人愿意消除的缩小转化范围:
char ch = '0' + v % 10;
Run Code Online (Sandbox Code Playgroud)
例如,涉及int到char转换(缩小范围);在 C++11 中:
char ch{ '0' + v % 10 };
Run Code Online (Sandbox Code Playgroud)
是非法的(但 VC++ 和 g++ 都接受它,g++ 带有警告)。我怀疑,为了可用,禁止缩小转换至少必须在以下情况下例外:由于整数提升、混合类型算术而导致较宽类型本身的情况以及源表达式是“适合”的编译时常量的情况目标类型。
| 归档时间: |
|
| 查看次数: |
1101 次 |
| 最近记录: |