
浅谈Go语言不提供隐式数字转换的原因

什么是隐式转换
在 C 语言中,隐式数字转换是指在某些情况下,编译器会自动将一个数据类型转换为另一个数据类型,而不需要明确地进行类型转换操作。
以下是一些常见的隐式数字转换规则:
当一个整数类型和一个浮点数类型进行运算时,整数类型会被自动转换为浮点数类型。
当一个表达式中包含两种不同类型的整数类型时,小范围的整数类型会被自动转换为大范围的整数类型。
当一个表达式中包含两种不同类型的浮点数类型时,精度较低的浮点数类型会被自动转换为精度较高的浮点数类型。
以下是一个使用隐式数字转换的 C 语言代码示例:
#include <stdio.h> int main() { int a = 5; float b = 3.14; double c = a + b; // 整数类型 a 隐式转换为浮点数类型 printf("%f\n", c); int d = 10; long e = 100; long f = d + e; // 小范围的整数类型 d 隐式转换为大范围的整数类型 printf("%ld\n", f); float g = 1.23; double h = 2.34; double i = g + h; // 精度较低的浮点数类型 g 隐式转换为精度较高的浮点数类型 printf("%lf\n", i); return 0; }
Go 语言如何处理数字转换
不同类型进行运算,就算底层数据类型一致也不支持。
type Integer int func main(){ var a int32 = 1 var b Integer = 2 fmt.Println(a + b) // 编译报错 Invalid operation: a + b (mismatched types int32 and Integer) }
正确的处理方式应该是显式转换
type Integer int func main(){ var a int32 = 1 var b Integer = 2 fmt.Println(a + int32(b)) // 编译通过,打印 333 fmt.Println(Integer(a) + b) // 编译通过,打印 333 }
不支持的原因
Go 语言的主要设计者基本都从事过 C/C++语言设计或者编译器的设计,他们认为在隐式数据转换上面得到的便利性不足以消除其带来的诸多问题。
- 易读性和可靠性:显式类型转换可以让代码更加明确,有助于提高代码的可读性和可靠性。对于需要进行类型转换的地方,显式地写出类型转换的代码更能让人理解代码的意图。
- 减少错误:隐式类型转换容易引起代码错误,比如在计算浮点数时,如果整数被隐式地转换成浮点数,可能会导致精度丢失或计算错误。显式类型转换可以帮助程序员更好地控制类型转换,减少这类错误的发生。
- 代码维护:隐式类型转换会使代码的行为不太明确,这会使得代码更难以维护。如果需要调试或修改代码,显式类型转换可以让程序员更容易理解代码的行为。
- 使编译器复杂化;“通常的算术转换”不容易实现,并且在不同的体系结构中不一致,(备注:我的理解是提供隐式数据类型转换,会增加编译器的难度)
到此这篇关于浅谈Go语言不提供隐式数字转换的原因的文章就介绍到这了,更多相关Go 隐式数字转换内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
相关推荐
-
golang类型推断与隐式类型转换
目录 前言 一.常量的隐式类型转换 1.常量的声明 2.常量的类型转换 3.隐式转换的原理 二.变量的类型推断 1.类型推断的原理 三.类型推断示例分析 总结 前言 golang类型推断可以省略类型,像写动态语言代码一样,让编程变得更加简单,同时也保留了静态类型的安全性. 类型推断往往也伴随着类型的隐式转换,二者均与golang的编译器有关.在了解了golang的类型推断与隐式类型转换原理后,将对如下问题信手拈来——下述代码能通过编译吗?b的值是什么类型? // eg.1 a := 1.1 b
-
浅谈C语言之字符串处理函数
下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数).所有的C语言编译系统中一般都提供这些函数. 1.puts函数--输出字符串的函数 一般的形式为puts(字符串组) 作用:将一个字符串输出到终端.如,char一个string,并赋予初值.调用puts(string);进行字符串的输出. 2.gets函数--输入字符串的函数 一般的形式:gets(字符数组) 作用:从终端输入一个字符串到字符数组,并且得到一个函数值成为字符数组的起始地址. gets(str); 键盘输入,
-
浅谈c语言中转义字符的用法及注意事项
c语言中的转义字符: \a 响铃符 \b 退格 \f 换页符 \n 换行符 \r 回车符(回到该行的首位置) \v 纵向制表符 \\ 反斜杠 \? 问号(?经vs10测试可以直接打印) \"(\') 双引号(单引号) \ooo 八进制数(ooo表示一个用8进制数表示出来的对应ANSII代码对应出字符,用此方法可以表示出所有ASCII字符.不过测试发现打不出%号,存疑!) \xhh 十六进制数(功能同八进制数,用hh表示一个十六进制数,如\x20表示空格) 注:使用转义字符的退格符,换行符,回车符
-
浅谈C语言的字节对齐 #pragma pack(n)2
#pragma pack(n) 这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对齐. #pragma pack () 作用:取消自定义字节对齐方式. #pragma pack (push,1) 作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐 #pragma pack(pop)
-
浅谈C语言=与==的区别详解
在 C 语言中,最容易产生混淆的操作符要属"="与"==".其中,"="并不等于符号,而是赋值操作符,如 x=3.除此之外,还可以在一个语句中向多个变量赋同一个值,即多重赋值.例如,在下面代码中把 0 同时赋给 x.y 与 z. x = y = z = 0; 相对于只有一个等号的赋值操作符,关系操作符中的等于操作符采用两个等号"=="来表示.正因如此,导致了一个潜在的问题:出于习惯,我们可能经常将需要等于操作符的地方写成赋值操
-
浅谈Go语言中的结构体struct & 接口Interface & 反射
结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struct类型理解为类,可以定义方法,和函数定义有些许区别: struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User) struct使用 下面示例中user1和
-
浅谈c语言中一种典型的排列组合算法
c语言中的全排列算法和组合数算法在实际问题中应用非常之广,但算法有许许多多,而我个人认为方法不必记太多,最好只记熟一种即可,一招鲜亦可吃遍天 全排列: #include<stdio.h> void swap(int *p1,int *p2) { int t=*p1; *p1=*p2; *p2=t; } void permutation(int a[],int index,int size) { if(index==size) { for(int i=0;i<size;i++) print
-
浅谈C语言共用体和与结构体的区别
共用体与结构体的区别 共用体: 使用union 关键字 共用体内存长度是内部最长的数据类型的长度. 共用体的地址和内部各成员变量的地址都是同一个地址 结构体大小: 结构体内部的成员,大小等于最后一个成员的偏移量+最后一个成员大小+末尾的填充字节数. 结构体的偏移量:某一个成员的实际地址和结构体首地址之间的距离. 结构体字节对齐:每个成员相对于结构体首地址的偏移量都得是当前成员所占内存大小的整数倍,如果不是会在成员前面加填充字节.结构体的大小是内部最宽的成员的整数倍. 共用体 #include <
-
C语言中自动隐式转换与类型强制转换实例分析
本文通过一个C程序实例对C语言中自动隐式转换与类型强制转换的注意点进行深入分析,详情如下: 先看一个C程序: #include<stdlib.h> #include<stdio.h> #include<conio.h> double proc(int q){ int n; double sum,t;//本例的关键就在这几个变量的类型上 sum = 2.0; while(sum<=q){ t=sum; //sum = sum+(n+1)/n;//自动隐式转换 sum
-
浅谈C语言的字符串分割
说起来很有意思,自认为对C语言理解得还是比较深刻的.但居然到今天才知道有个strtok函数,试用了一下突然感慨以前做了多少重复劳动.每次需要解析配置文件,每次需要分割字符串,居然都是自己去分割字符串,既累人又容易出错.感概技术学得不够全面啊!这里引用一段strtok用法: The strtok() function returns a pointer to the next "token" in str1, where str2 contains the delimiters that
-
浅谈C语言转义字符和格式控制符
转义字符参考: \a:蜂鸣,响铃 \b:回退:向后退一格 \f:换页 \n:换行,光标到下行行首 \r:回车,光标到本行行首 \t:水平制表 \v:垂直制表 \\:反斜杠 \':单引号 \":双引号 \?:问号 \ddd:三位八进制 \xhh:二位十六进制 \0:空字符(NULL),什么都不做 注: 1,\v垂直制表和\f换页符对屏幕没有任何影响,但会影响打印机执行响应操作. 2,\n其实应该叫回车换行.换行只是换一行,不改变光标的横坐标:回车只是回到行首,不改变光标的纵坐标. 3,\t 光标向
随机推荐
- VBS脚本写的Windows硬件检测工具分享
- 多首歌曲连续播放之asx播放列表文件
- Ajax全局加载框(Loading效果)的配置
- SQL Server远程定时备份数据库脚本分享
- 原生JavaScript实现AJAX、JSONP
- Java语言一元运算符实例解析
- .Net笔记:System.IO之windows文件操作的深入分析
- ASP.NET控件10个最有用的属性详解
- 动态统计当前输入内容的字节、字符数的实例详解
- 一个支持普通分页和综合分页的MVC分页Helper
- Ajax犯的错误处理方法
- C#语言基础——结构体和枚举类型全面解析
- Java解压缩zip - 解压缩多个文件或文件夹实例
- 浅谈javascript事件取消和阻止冒泡
- JQuery中使用.each()遍历元素学习笔记
- Alt+Ctrl+Del与Shift+Ctrl+Esc的区别剖析
- JavaScript获取URL中参数querystring的方法详解
- Windows XP中轻松获取未使用的IP地址的批处理文件
- jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
- 让超链接显示提示信息的js代码
其他
- 利用matplotlib库任意绘制三种不同类型的基础图表
- layui 复选框禁用
- r语言csv数据转为list
- IDEA中建立新的module为什么会进入别的项目
- 美化alert、confirm
- Layui的ajax表单验证
- gan数字手写体识别代码 pytorch
- vue的get请求拿到响应标头里的参数
- idea junit lib配置
- 廖雪峰tkinter
- vue3 预览 pdf
- java SQL异常有哪些 插入重复
- antdesign里面Invalid date
- LocalStorage 设置时间
- 页面vuex添加tag,但组件页面无变化
- element版本查询
- 易语言短信验证码获取
- EasyUI Datagrid 去掉顶部某列的排序箭头
- vue要刷新页面表格数据才更新
- js中 body控件获得光标位置