![](https://img-blog.csdnimg.cn/20210217151908234.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
编程语言
编程语言相关的文章
Marco&GalaxyDragon
这个作者很懒,什么都没留下…
展开
-
C#委托和事件的区别
区别委托事件是否可以使用=来赋值是否是否可以在类外部进行调用是否是否是一个类型是否原创 2021-02-21 23:21:13 · 266 阅读 · 0 评论 -
Dart语言语法特性简介(2)
上一期主要介绍了dart和其他一些新语言比较类似的特性,这一期介绍一些dart里面独有,或者在其他语言里比较少看见的特性。1.内置对fluent api的支持,中文翻译过来应该是链式调用,或者流式调用 目前很多语言的库都喜欢搞成fluent api,最知名的应该是jquery库了,实现也很简单,在方法最后返回this就可以。不过也有些时候实在没法返回this。 不过dart语言提供了内置的支持v原创 2017-11-27 10:44:36 · 3864 阅读 · 0 评论 -
Dart语言语法特性简介(1)
dart是一个新的全栈式语言,主要目标是为了替代js,ts,但是也可以开发app,native的程序。嘛反正现在新语言很多都是全栈的js自己也是所以没什么新奇的,就不多说了。 这一篇主要说说他的一些语法特性1.强面向对象,和ruby,python类似,所有元素都是对象,和java/c++这些基础数据类型不能当对象来用的相反。(不过java/c++也一直在改进只是因为历史遗留原因肯定没有一个新出的语原创 2017-11-27 00:58:31 · 1116 阅读 · 0 评论 -
五十种编程语言简介(1)
tiobe榜上的语言大致可以分为这么几类1.c系的,拥有(一定的)底层编程能力(例如指针,直接的内存访问),静态类型,编译型,想取代c/c++的 例子:c c++ go rust c#(c#其实不能算是编程语言了,不过不知道放哪,先放这里了)2.java系的,java语言虽然特性少,但是java生态系统很强大,所以出现了很多想替换掉java的语言,这些语言的特性都是由很多现代化的语法特性,以及对j原创 2017-11-27 13:35:04 · 1223 阅读 · 0 评论 -
五分钟学会markdown
简介Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式,其功能可以算得上是html的子集。为什么要学这个东西主要功能就是写文章的时候可以做一些简单的排版,而且最主要的是现在许多的博客,或者其他发文的网站都支持了这种格式,例如stackoverflow,github,当然也包括我现在在用的csdn。相比于以前每个网站各用各的内部编辑器,学原创 2017-11-25 23:58:48 · 302 阅读 · 0 评论 -
Ruby标准库中方法名称的?和!后缀
其实这两个符号没有什么特殊作用,只是方法名的一部分,但是他们代表了ruby的一些希望你编写方法时遵守的规则。(当然你也可以不遵守)可以看到,标准库中所有后缀为?的方法,返回的都是布尔值。这点其实倒没什么,我们在java ,c++中更倾向于用前缀is(而且java,c++方法名里也不能出现? !这些特殊符号)puts 123.kind_of? Numeric而!后缀需要注意,他代表该原创 2018-01-11 21:33:30 · 500 阅读 · 0 评论 -
Ruby Mixin与c++多继承的问题
看到许多地方写到,ruby的mixin可以完美解决c++多继承带来的问题。(包括一本著名的书《programing ruby》),而对怎么解决,却常常语焉不详我就纳闷了,哪里解决了?该出现的问题还是会出现,而且更难发现了。首先先回忆一下c++多继承导致的问题 一个类,同时继承两个类,两个类里变量名重复或者方法名重复(除非是private访问控制权限),此时编译器就会不知道该名字对应的是哪原创 2018-01-11 15:10:15 · 443 阅读 · 0 评论 -
Ruby实现高阶函数
ruby的方法块并不像js,as,c#,kotlin或者其他语言一样那样可以直接传递,他非要转换成proc的对象才能处理,这点有些蛋疼#高阶函数#方法参数需要加前缀&来识别def n_times(times,&sth)#方法块想转换成可以返回的proc需要用lambda{}关键字来转换 lambda {times.times {sth.call}}end#传入两个参数,返回一原创 2018-01-09 13:19:00 · 516 阅读 · 0 评论 -
Ruby对比java,c++变量作用域问题
很多有java,c#,c++经验但没有ruby,perl经验的人初次学习应该都会被ruby,perl的变量作用域搞的有点混(我一开始也是)。看了一些书,对这个地方也没有做清楚的解释或者根本没有解释。其实只要知道一点,java,c++,c#这些语言中,变量的最大作用域和他声明的位置有关,例如在方法里声明,最大作用域是整个方法体,在类里声明,最大作用域是整个类。如果有两个变量重名,则取和当前作用域原创 2018-01-09 11:10:31 · 546 阅读 · 0 评论 -
ruby普通二分查找和递归二分查找
#普通二分查找 def binSearch(arr,value) left=0 right=arr.length-1 while left<=right center=(left+right)/2 if arr[center]== value return center elsif arr[center]<value原创 2017-12-16 14:42:04 · 384 阅读 · 0 评论 -
Ruby插入排序的常规写法和递归写法
用循环的常规写法arr=[5,2,3,1,4]#循环下表1~arr.length,注意初始时最左边因为只有一个值,所以可以看成左边数组0~1已经有序1.upto arr.length-1 do |outIndex| #取值 element=arr[outIndex] #生成子下标,数值为外部下标的左边一位(因为自己与自己比较没有意义) index=outIndex-1 #下标原创 2017-12-16 13:34:36 · 317 阅读 · 0 评论 -
Ruby快速学(1)-类
声明类class Student #类方法 def Student.StudentCreated @@studentCreated end #前面加两个@创建类变量 @@studentCreated=0 #使实例变量name和age对外部可读,类似于java的get方法 attr_reader :name,:age #使实例变量name和age对外部可写,类似于j原创 2017-11-25 12:44:30 · 241 阅读 · 0 评论 -
Ruby和Python的语法差异(2)
访问控制面向对象最重要的三个特征就是封装,继承,多态,而访问控制符就是实现封装的很重要一部分。 python并没有真正的访问控制,只有一个用来遵守的惯例,即_下划线开头的为私有属性,不过解释器并不会检查,这点对构建大一些的程序非常不友好而ruby具有和c++/java 类似的访问控制符 public private protected原创 2017-11-23 20:35:24 · 255 阅读 · 0 评论 -
Ruby和Python的语法差异(1)
基础学习一个新语言的语法,比较他和已经学会的语言,是一种再好不过的方法了。 这边我们抛开所有的库,平台,各种各样无关的东西,单纯的来比较ruby和python的语法,适合会其中一个语言想快速学另外一个的人看。1.python依靠强制的缩进来识别一段结构,而ruby使用明确的end,python的问题就是在很多结构都不对的时候,ide没法自动帮你做format,或者没没法完全正确的format 2原创 2017-11-23 15:13:58 · 631 阅读 · 0 评论 -
Python为什么简便?
几年前就听说过这个语言,只知道他一直越来越火,却一直没有想去使用它的念头,我在写一些类似脚本的东西时会倾向于选择shell,或者直接用一门静态语言编写,而如果是构建一些比较大的程序,我绝对不想用一门动态语言编写。 但是最近突然发现他在tiobe上的排名居然已经超过了c#,排到了第四的位置,同时还有在继续上升的意思,这让我非常不解,python到底有什么神奇的魔力? 同时也让我决定还是学习一下py原创 2017-11-23 11:23:17 · 292 阅读 · 0 评论 -
Python学着玩(1)-元组
python元组使用()声明,与列表的[]所区分例如tuple= (1, 2) #声明元组list= [1, 2] #声明列表说到这里我突然想到一个事情,像元组列表这些字面量的声明无非就是语法糖,但是为什么在一些静态语言中却看不到这样的设计呢? 例如 kotlin声明一个list val list=listOf(1,2,3) #声明一个列表后来想了想,应该还是因为动态语言和静态语言对效率上的要求原创 2017-11-22 20:38:45 · 517 阅读 · 0 评论 -
cpu端口读写
程序真正对电脑硬件的控制只有cpu,编写cpu可以识别的指令,让cpu执行。而对其他硬件的控制都是间接通过cpu来进行的。和CPU通过控制总线相连的部件有以下几类 1.主板上的接口芯片 (键盘,鼠标接口) 2.各种接口卡(网卡,显卡),cpu通过控制接口卡来驱动硬件工作 3.存储设备,内存,显存,这些存储空间地址是线性连续的。cpu可以直接读写以下三个地方的数据,读写三个地方的指令都是不同的,原创 2017-12-04 13:52:59 · 2422 阅读 · 0 评论 -
java和c语言变长参数的底层实现区别
java和c语言变长参数的底层实现存在着区别java其实是一个语法糖 类似private static int sumUp(int... values) {}其实最后编译时会转化为 实际上是传递了一个数组引用private static int sumUp(int[] values) {}所以如果同时写这两个函数,就会编译不通过,他们本质上是一样的而c语言的变长参数就要说到函数调用约定了原创 2017-09-05 23:51:42 · 464 阅读 · 0 评论 -
简单c语言汇编后代码解释(1)
今天我们来以一个简单的案例来解释c语言对应汇编语言的关系 #include "stdio.h"long add(long a, long b){ long x = a, y = b; return (x + y);}int main(int argc, char* argv[]){ long a = 1, b = 2; printf("%d\n", ad原创 2017-09-05 21:43:51 · 1367 阅读 · 0 评论 -
lua里的迭代器
lua里的迭代器可以想成是java里的foreach循环。大家都知道java里的foreach是一个语法糖,只要一个类实现了iterable,就可以使用foreach来迭代他里面的每一个元素,实际上就是调用该迭代器然后展开一个while循环。(c#以及各种语言都有类似的概念)。lua里的这个foreach稍微有点不同,他的table不是天生可以迭代的,而是需要提供一个迭代器函数,这个迭代器函数的要求原创 2017-11-30 14:37:14 · 361 阅读 · 0 评论 -
深入学习c#(2)
Static Classes类可以被声明为static,表明他只能包含静态成员和静态方法,这种强制性可以防止出错,一些工具类例如math,可以声明为static类Partial Types and MethodsPartial关键字允许类定义分开来存在,这样用一些外部工具自动生成代码就非常方便// PaymentFormGen.cs - 自动生成类partial class PaymentForm原创 2017-10-25 14:24:33 · 350 阅读 · 0 评论 -
C#深入学习(1)
c#也用了好久了,最近重新看书,看到一些之前没怎么注意过的或者没怎么用过的语法特性,记录一下,争取以后多用用。Implicitly Typed Local VariablesC#中也有类型推断的功能,关键字为varvar x = "hello";var y = new System.Text.StringBuilder();var z = (float)Math.PI;等价于string x原创 2017-10-25 11:04:08 · 2525 阅读 · 1 评论 -
haskell学习笔记(9)-再谈模式匹配
我们在写一个函数时,有一个很通用的步骤,即从传入的参数中进行一些预处理,比如从对象中取出某个属性,然后声明一些局部变量。例如将一个Point类的xy属性相加,我们一般会这样写(不用考虑此函数本身的意义了…) public double add(Point p) { int x=p.x; int y=p.y; return x+y; }虽然原创 2017-12-28 11:29:56 · 944 阅读 · 0 评论 -
haskell学习笔记(8)-haskell的类型系统
类型推导haskell因为支持类型推导,所以大多数时候不用显式写出类型声明,但是如果要写库的话,最好是写上类型声明,可以当做文档使用,看上去一目了然。haskell的类型推导比大部分语言要强不少,例如和同样有类型推导的kotlin相比,kotlin并不支持传入参数的自动推导 例如//a b参数都要写明类型fun max(a:Int,b:Int)=if (a>b) a else b//这样是编译原创 2017-12-28 09:51:51 · 594 阅读 · 0 评论 -
haskell学习笔记(7)-高阶函数Curried functions
在很多语言中都有高阶函数的存在,其定义也非常简单,函数作为参数和返回值传来传去,这样的函数就被称作高阶函数。例如很多gui库都接受一个函数作为事件的回调方法,这个就是函数作为参数。 又比如java8的 Comparator.comparing,接受一个函数返回一个函数,也是高阶函数。函数式编程讲究的就是一个灵活,我们可以把世间万物看成行为和数据,面向对象可以看成是对对象进行抽象,而函数式编程则是在原创 2017-12-27 21:07:26 · 1100 阅读 · 0 评论 -
haskell学习笔记(6)-Parameterised types与Recursive types
看了两本书《haskell趣学指南》《real world haskell》,都对这里语焉不详。根据我自己的理解,Parameterised types就是其他语言中泛型在一个函数式语言中的特殊表示法。这两本书都出现了下面一段代码,而没有详细的解释data Maybe a = Just a | Nothing用比较熟悉的词汇来说,Maybe就是一个类名,a是泛型参数名,类似原创 2017-12-25 11:56:56 · 477 阅读 · 0 评论 -
haskell学习笔记(5)-函数与递归
任意循环结构都可以转化为递归,这就是haskell没有for while也可以实现任何应用的原因。有些问题可以很容易的看出递归形式(如归并排序,快速排序),不过有的问题却不太容易(例如查找一组数中的最大值,统计数组的长度)。训练将任意问题都看成递归形式的能力,可以帮助我们更好的写出haskell代码,甚至是脱离了haskell之后,也可以使我们解决问题时多了一件工具。更好的理解一些比较复杂的算法(非原创 2017-12-19 12:06:15 · 1614 阅读 · 0 评论 -
haskell学习笔记(4)-函数入门
模式匹配 (Pattern matching)haskell可以定义同名函数,然后会根据声明顺序搜索与传入参数最接近的函数签名,然后调用那个函数,可以看成是强化版的函数重载。模式匹配的参数可以是字面量--调用名为lucky的函数时,匹配情况为--匹配传入参数是7的情况lucky 7 = "LUCKY NUMBER SEVEN!" --匹配任意的单个传入参数lucky x = "Sorry,原创 2017-12-19 09:56:57 · 832 阅读 · 0 评论 -
haskell学习笔记(3)-Types and Typeclasses
haskell是静态类型加类型推导,现在静态类型中的类型推导现在也越来越常见了,其实确实只看值就知道是什么类型了,写上类型反而使代码看的混乱。haskell里的函数也是有类型的,其实也就和c/c++的函数指针差不多,需要申明输入什么类型,输出什么类型,才能指向某个函数,haskell也就是换个语法而已。可以在ghci 里使用:t来查询值以及函数的类型#这个意思就是==函数 接受两个Eq类型,返回bo原创 2017-12-17 18:39:05 · 730 阅读 · 0 评论 -
haskell学习笔记(2)-List Comprehension
数学中的集合有两种表达形式,分别是 列举法{1,2,3,4,5} 描述法{x|x<=5} 一般的编程语言只支持了列举法,支持描述法的寥寥无几,不过haskell就是其中的一种(python的列表推导算半个)接下来用描述法来表示一些集合[x*2 | x <- [1..10]]#相当于[2,4,6,8,10,12,14,16,18,20][x*2 | x <- [1..10], x*2 >=原创 2017-12-17 18:23:01 · 701 阅读 · 0 评论 -
haskell学习笔记(1)
haskell里不区分语句和表达式,即所有语句都有值 例如 (if x > 100 then x else x*2) + 1 就是将if语句的返回值加上1 (常规来说,语句就是不返回值的表达式,但是现在也有很多语言不区分语句和表达式了(例如kotlin),很多区分的语言基本上都是受了C的影响(例如java),其实这两者并没有必要分开来)haskell的let和js的let一样,都是为变量限定原创 2017-12-17 13:19:33 · 461 阅读 · 0 评论 -
JS给数字添加扩展方法
扩展方法就是给原生类型添加方法,让对象用起来更加方便,JS作为一个动态语言,只要在原型链上稍作修改就可以给现有类添加方法(在js里提类可能不太恰当,但是我想不出别的说法了)先回忆一下如何给Array添加一个拓展方法 Array.prototype.get=function (index) { return this[index] }这样就给array添加了...原创 2018-10-24 14:58:47 · 1510 阅读 · 0 评论 -
使js构造函数不会被当做普通函数调用的技巧
例如一个类A我们可以在构造函数的开头使用_classCallCheck来检测this指针function A() { _classCallCheck(this, A);}function _classCallCheck(instance, Constructor) { if (!(instance instanceof Construct原创 2017-09-12 19:54:25 · 610 阅读 · 2 评论 -
js禁用上下文菜单的代码
var elements = document.body.getElementsByTagName('*');var oncontextmenu = function() { return false; };for (var i = 0; i elements.length; i++) { elements[i].oncontextmenu = oncontextmenu;}原创 2017-09-07 17:10:43 · 484 阅读 · 0 评论 -
js禁用文本选择的代码
以下代码可以在所有浏览器中屏蔽文本选择var body = document.body;body.style.userSelect = 'none';body.style.webkitUserSelect = 'none';body.style.msUserSelect = 'none';body.style.mozUserSelect = 'none';原创 2017-09-07 17:08:15 · 316 阅读 · 0 评论 -
惰性求值-Lazy evaluation
惰性方法是指一系列嵌套的方法的求值被延迟到一个求值(方法|表达式)的出现。 用haskell做说明的话print (drop 2 "abcd")drop 不是一个求值方法,而print 是一个求值方法,所以其实是print 导致了 (drop 2 “abcd”)被求值。在上面这种简单的情况下可能看不出惰性求值的作用,我们看一个比较复杂的例子sum (takeWhile (<10000) [m |原创 2017-12-25 09:47:02 · 1400 阅读 · 0 评论 -
从C到C++,汇编中类的实现
实例变量的初始值在C中,结构体的变量是不能赋初始值的,而是在使用结构体的时候才能指定他们的初始化值,体现在汇编就是在栈帧中按照顺序依次赋值。在C++中,这个初始化就是靠构造函数来实现的。在很多书中,常常说到如果不显示指定构造函数,编译器会默认添加一个构造函数,这种说法是不严谨的,如果构造函数没有任何事可做,何必添加一个构造函数来降低执行效率呢?具体什么时候会添加构造函数解释起来比较复杂,只要知道一点原创 2018-03-01 19:36:52 · 1782 阅读 · 1 评论 -
C语言直接返回结构体汇编后结果
(以下为使用vc以及debug编译下的结果)一般来说,返回小于等于4字节的基本类型,例如short,int,都是直接使用eax寄存器返回,而指针,也是使用eax寄存器返回。 如果是8字节的基本类型,例如c++的long long 类型,很可能是使用两个寄存器,如eax和edx返回结果。 实际上,如果结构体或者说类只占8字节或者更小的话,也是直接使用寄存器返回的。 但是如果结构体占用空间比较大,原创 2018-02-23 18:55:50 · 2269 阅读 · 0 评论 -
C++模板VSJava泛型
JAVAjava泛型是实现是通过强制cast。 如 static T test(T a){ return a; } //该方法最后会被转换成如下形式 static Object test(Object a){ return a; } //此时我们所有的调用int i=test(1);//最后也会被转化成如下形式int原创 2018-02-07 00:07:01 · 466 阅读 · 0 评论 -
C/c++编译时的def文件
即使你根本不使用C++,Microsoft的C编译器也会损害C函数。当你的函数使用__stdcall(WINAPI)调用规则时会出现这种问题。这种调用规则是最流行的一种类型。当使用__stdcall将C函数输出时,Microsoft的编译器就会改变函数的名字,设置一个前导下划线,再加上一个@符号的前缀,后随一个数字,表示作为参数传递给函数的字节数。若要使用与其他编译器供应商的工具链接的Microso原创 2017-12-02 14:57:32 · 2718 阅读 · 0 评论