辛巴学院-Unity-剑英陪你零基础学c#系列(三)计算与类型
辛巴学院:正大光明的不务正业。
中秋节快乐,每逢佳节倍思亲,尤其是那素未谋面的老婆,对吧,屌丝们。
今天我们来探索一下C#里面奇怪的计算,奇怪的类型。
奇怪的计算
当我刚刚接触计算机编程的时候,一切在我看来都是奇怪的。
i++
i=i+1
i==i+1
这都是些什么鬼?
机器语言是图灵机模式的,那玩意不是人类语言,是关于操作寄存器的。
附:图灵机视频地址测试版:
http://v.youku.com/v_show/id_XMTM0MDg0NjUxMg==.html?from=y1.7-1.2
高级语言是模拟人类语言的,可是上面那些鬼用人类语言完全看不懂呢。
没人能看懂,以自然语言的角度来说做了很多的省略。
此处的等号和数学的等号全无关系,而是替代自然语言的一个简化符号
不仅仅是等号,编程语言中出现的所有符号,他其实都是想说一句话,不一定和你数学中熟悉的那个符号表达相同含义
i++ (他想表示一句话,让i这个变量的值增加1)
i=i+1(他想表示一句话,让i这个变量的值改变,改变为i+1)(这里初学会很纠结我们等下来解释)
i==i+1(他想表示一句话,判断i 是否和 i+1 相等)
你要时刻提醒自己,这不是数学,这不是数学,这不是数学
高级语言中,所有的语句,都想表示一句话
i=i+1,表示的这句话是不是有点奇特呢?让i这个变量的值改变,改变为i+1。他们的时空观到底是个what?放心,这不是黑客帝国。
我们的时空观还在牛顿经典物理水平。(初中物理水平)
前面讲过:"代码是棵树,执行有顺序"。这就是个顺序的问题。他相当于先拿一个临时变量j=i+1,这就没有时空困扰了,然后再让i=j。
并不是时空观上有什么奇怪,而是这句话隐含了一个中间出现临时变量的机制。
初学者可能会在这里绕圈圈绕一会儿,没关系,多绕一下。
=这个符号,是"让谁的值改变为xxx"的代表符号,而不是数学中的等号
3
2
1
绕清楚了么?
对加减乘除与数值类型来说,倒是和数学意义一致,不用特别说明
然后出现的奇怪计算是这个:i==i+1
这个叫做逻辑运算,完整的写法应该如下:bool b =i==i+1; 完整的想要表示的自然语言是:让b的值改变为是或否, i是否与i+1相等。
所有的逻辑运算得到的结果只有是或否,bool型 专门用来表示这个 是 或 否。Int型专门表示整数。
逻辑类型最常用的场合是配合if做选择逻辑,If(i>2)隐藏了一些细节,完整的写法是
bool b = i>2;
if(b)
{
…
}
c#将所有的需要逻辑表达式的场合,统一为使用bool类型的参数。
也就是说c#中所有使用逻辑运算的场合,均可如上面那样展开写一个明确的bool变量。
当你写到这些问题完全不会绕住,完全不会弄错,你可以完全忽视这一切。
现在,假如你写代码写到逻辑运算绕住了,那你可以把他展开写,更容易看懂。
只要你始终牢记所有的运算符都是想说一句话,那就不会陷入这个陷阱中。
其实不止是运算符,高级语言我们说过,整个就是颗树,每一句都是想说一句话,一句人类的话,只是太多的简化,说的不那么好。
C#中还有一类特殊的计算,位运算,这个是2进制的范畴,在逻辑清晰要求剩余内存要求的现下,位运算出镜率已经接近于零,所以我们不提这个部分。
奇怪的类型
在讲到类型,一般来说,言必及封装继承多态,言必及面向对象。
我们还没到那里,收回来,不要去考虑面向对象的问题,面向对象讲的是:猫继承自动物,狗继承自动物,波斯猫继承自猫,短毛猫继承自猫。
深不以为然,而且现下,我们并不是要去考虑面向对象的问题。
为什么我们在c#里 不能直接写 i=1,而要写int i=1;为什么所有新的变量前面都有个类型 int float string bool,blabla,各种各样的东西,为什么?
不写可不可以,当然可以,basic就是这样的语言,不用区分变量类型。这些事情交给runtime去处理。
这是程序圈里面分为两派一直在口水的一个问题。而静态类型语言,初始设计只是为了贴近机器语言,类型明确,就更容易翻译为机器语言,因为机器语言严格区分类型
Int 只能和 int计算 float 只能和float计算,机器语言也只有整数和 有小数点的数这两种类型。
后来,静态类型定义 和 动态类型识别 已经成为了两种设计原则与方法论,已经脱离了这个好处,和机器语言一点关系都没有啦。
目前静态类型定义语言主要的好处是语义明确,很多类型相关的错误,在编译阶段就会暴露出来,根本不需要到程序执行起来出错来看。
但动态类型识别语言却强调他们的简洁,写代码少,语言更接近人类语言,毕竟人类说话时是不带着"类型"的
Int i=2+3;人类不会说 让(整数)i的值改变为( 整数)2 加( 整数)3.
但是现在的机器语言会,大家都知道cpu跑分的时候会分别跑整数运算能力和浮点运算能力。说的就是机器运算不同类型的能力。
总结一下,静态类型定义语言,由编译器的偷懒开始,现在是为了更明确,为了编译器更早的帮你发现问题。
其代价,就是你说话的时候,得多说出来类型。
你没得选择,但c#给了你一个变通的方式偷懒。
var i=2+3; 让变量i的值等于整数2+整数3,帮我确定i的类型。
var 在c#里用来告诉编译器,帮我确定i的类型,他只能用于编译器可以根据右边的表达式帮你推断出类型的情况。
这种情况十之八九,但有时候也会有些困扰,不建议你在学习初期写一大堆的var,把类型认知的事情都推给编译器。
中秋节到了,少说一点,下次聊函数和封装。
哈库拉玛塔塔。
辛巴学院-Unity-剑英陪你零基础学c#系列(三)计算与类型的更多相关文章
- 辛巴学院-Unity-剑英陪你零基础学c#系列(一)Hello World
这不是草稿 辛巴学院:正大光明的不务正业.辛巴学院:攻城狮与荣耀石. 剑英陪你系列又来啦.剑英是一个有大爱的人,热爱每一个程序员,尤其是年轻漂亮的女程序.最近组织朋友们玩了一次即兴团体诗创作,无论怎么 ...
- 辛巴学院-Unity-剑英陪你零基础学c#系列(四)函数和封装
辛巴学院:正大光明的不务正业. 国庆长假结束了,我的心情是这样的: 你总是起不早,起不早独自一个人沉睡到天亮你无怨无悔的梦着那副本我知道你根本就不想上班你总是起不早,起不早放假总是短暂,上班太难请个病 ...
- 辛巴学院-Unity-剑英陪你零基础学c#系列(二)顺序
这不是草稿 辛巴学院:正大光明的不务正业. 上一次的教程写出来之后,反馈还是挺多的,有很多都做了修改,也有一些让人崩溃,不得不说上几句.有些人有些很奇怪的地方,你写篇东西,被看了以后不说他感觉怎么 ...
- 辛巴学院-Unity-剑英的c#提高篇(一)主循环
这是测试版 辛巴学院:正大光明的不务正业. 最近刚刚离开了我服务了三年多的公司,因为一个无数次碰到的老问题,没钱了. 之前不知道做什么好的时候,机缘巧合之下和哒嗒网络的吴总聊了一下,发现了vr gam ...
- 剑英陪你玩转图形学(五)focus
很久没来和大家交流业务(zhuangbi)水平了,最近实在是很忙,报名了小游戏大赛,一点时间都抽不出,已经坑了. 今天抓紧时间和大家介绍一个小效果: 新手引导的时候,我们会需要一种全屏幕黑掉,只有一个 ...
- (转载)李剑英的CSLight入门指南结合NGUI热更新
原地址:http://www.xuanyusong.com/archives/3075 李剑英的CSLight入门指南文档撰写者:GraphicQQ: 1065147807 一. CSLIGHT 作者 ...
- 辛巴达:帮电商打造ZARA式开放供应链体系 - 行业网站 - 亿邦动力网
辛巴达:帮电商打造ZARA式开放供应链体系 - 行业网站 - 亿邦动力网 辛巴达:帮电商打造ZARA式开放供应链体系
- [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之纹理Textures
[我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之纹理Textures 本篇分享一下第6个已完工的视频,即<beginner Graphics ...
- [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之网格Meshes
[我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之网格Meshes 本篇分享一下第5个已完工的视频,即<beginner Graphics – ...
随机推荐
- resin实现域名访问
1.修改resin.properties 2.修改hosts文件 3.添加一行记录 配置完后就可以通过test.com访问项目了.
- 更改pip安装源的镜像解决安装总是timeout的情况
由于国外的pip源总是由于各种原因不能被访问或者网速过慢,而造成的timeout错误 解决方法是修改pip的配置文件(如果没有配置文件在相应的地方新建,配置文件的路径和名字参考这里),设置安装包时候访 ...
- java 读写properties (配置)文件
Properties属性文件在Java应用程序中是经常可以看得见的,也是特别重要的一类文件.它用来配置应用程序的一些信息,不过这些信息一般都是比较少的数据,没有必要使用数据库文件来保存,而使用一般的文 ...
- JS简单解决并发量
经常在写代码的时候碰到这样的场景:页面初始化时显示loading页,同时启动多个ajax并发请求获取数据,当每个ajax请求返回时结束loading. 举个例子,一个下订单的页面,要查询常用地址信息. ...
- NMAP分布式扫描工具dnmap
NMAP分布式扫描工具dnmap NMAP是一款知名的网络扫描工具.它提供丰富和强大的网络扫描功能.但很多时候,需要渗透测试人员从多个终端发起扫描任务,以快速扫描大型网络,或规避IP限制等安全策略 ...
- iOS 真机测试时报错:Provisioning profile "iOS Team Provisioning Profile: XXX” doesn't include the currently selected device “XXX”.
这几天因工作需要,去给客户演示iOS项目打包的过程.之前演示都是顺利的,但后来客户自己操作时打电话说遇到了问题,出现报错. 就过去看了一下,发现一个很陌生的错误提示: The operation co ...
- Ubuntu14.04 CUDA8.0 CUDN4.0 NVIDIA1080 多种深度框架(懒人三步装) - 从入门到放弃
这是一个懒人快速安装教程,1080卡有点麻烦,因为cuda需要8.0.为了安装方便直接把命令写成三个shell脚本. 代码基本是http://blog.csdn.net/langb2014/artic ...
- 【转】OBJECT_ID和DATA_OBJECT_ID的区别
在user_objects等视图里面有两个比较容易搞混的字段object_id和data_object_id这两个字段基本上有什么大的区别呢?object_id其实是对每个数据库中数据对象的唯一标识d ...
- PHP 分页函数
如果如下:
- 实现Android桌面的App快捷方式
本文描述的是,在App开发过程中,该如何实现App在Anroid桌面上生成App的快捷方式.主要分为两个步骤: 一,在AndroidManifest.xml中声明相关权限: <uses-perm ...