为什么斯威夫特和蟒蛇放弃?

为什么斯威夫特和蟒蛇放弃?

简单易用,-

当谈到自增()和自减(-)运算符时,我的朋友应该很熟悉它们。它们经常出现在许多编程语言代码中。

例如,常用于语句

复制代码

CPP

对于(int I=0;I n;i ) {

//TODO

}

例如,经典的单行代码可以复制字符串

复制代码

CPP

//将src内容复制到目标

void strcpy(char dest,char src) {

而(dest=src);

}

int main() {

char s1[10],* s2=' xmg _ mj

strcpy(s1,S2);

printf(“% s”,S1);//xmg_mj

返回0;

}

如果使用得当,autoincrement () autodecrement (-)运算符确实可以使代码简洁优雅。

但是

Swift和Python这两种流行的编程语言不支持自增()和自减(-),为什么?

以下是一些参考链接,感兴趣的合作伙伴可以自己阅读:

斯威夫特之父克里斯拉特纳解读

Swift3不支持,-

https://github.com/apple/swift-evolution/blob/master/proposals/0004-remove-pre-post-Inc-declaration . MD

堆栈溢出的问答

为什么Python中没有and运算符?

https://stackoverflow.com/questions/3654830

来自谷歌研究主管彼得诺维格

Python IAQ:不常回答的问题

http://norvig.com/python-iaq.html

这里有几个明显的原因。

有了强大而简洁的for-in,for语句就完全没有必要了,-

复制代码

迅速的

//C

对于(int I=0;一. 5;i ) {

cout i endl

}

//Swift

对于0中的I.5 {

println(i)

}

//蟒蛇

对于范围(5):内的I

打印(I)

虽然(d=s);它看起来简单而优雅,但对初学者来说并不简单,而且会增加学习成本。然而,Swift和Python更希望任何人都能快速学习编程语言。

当前缀和后缀混合时

这会降低代码的可读性,比如while (n-k),有经验的程序员必须停下来思考代码的含义。

运营结果可能存在不确定性。

运营结果的不确定性

下面列出了两个代码。变量B的结果是什么?(值得一提的是,这不是我们将在实际开发中编写的内容,这里列出它只是为了讨论一些技术细节。)

复制代码

CPP

int a,b;

//第1段代码

a=1;

b=a a a a

//第2段代码

a=1;

b=a a a a

事实上,上述MSVC和MinGW编译器下的C语言代码的结果并不完全一致。

MSVC:微软制造

MinGW:GNU(可以理解为GCC的视窗版本)

第1段代码

结果是一致的,满足了绝大多数人的期望,所以没有进行讨论。

复制代码

CPP

a=1;

b=a a a a

//MSVC:b=1 3 3 5=12

//MinGW:b=1 3 3 5=12

第2段代码

结果不一致。

MSVC的结果是1 1 1=4

MinGW的结果是1 2 3 4=10

复制代码

CPP

a=1;

b=a a a a

//MSVC:b=1 1 1 1=4

//MinGW:b=1 2 3 4=10

你可能会好奇:你怎么知道MinGW的计算过程是1 2 3 4?根据最后10回的结果来猜测?不!如果是这样的话,这将是对程序员职业的一点侮辱。

如果你想知道这样一个代码的真正本质,从表面上看不容易理解,你必须使用一个强大而精确的武器,那就是汇编语言。

简要解释使用汇编语言的原因:

众所周知,C语言代码最终将被编译成机器语言代码(也称为机器指令,仅由0和1组成)

通过研究最终的机器指令来探索C语言代码的本质怎么样?因为机器指令非常难理解,这对于普通人来说不是一个有效的方法。

最好的方法是在C语言和机器语言之间学习汇编语言代码。

c语言汇编语言机器语言

汇编语言代码比机器指令更易读。

每条机器指令都有相应的汇编语言代码

因此,当你学习汇编语言代码时,你基本上等同于学习机器指令,既有可读性又有准确性。

看看MSVC环境中的汇编代码

红框码:把4个A相加的结果分配给B。因为A的初始值是1,所以B=11 1=4

绿框码:让A执行4次自增1运算,相当于a=1的4倍

看看MinGW环境中的汇编代码

为了确保您能够基本理解该汇编代码,建议您能够理解[rbp-0x4]代表变量A,[rbp-0x8]代表变量B

绿框代码:让A执行增加1的操作,这相当于执行a=1

红框代码:在每次增加1之前累加A的值,最后给b赋值

可以看出,绿框码和红框码是交替执行的,所以最后的b=1 2 3 4=10

最后两个代码

最后,再输出两个代码,MSVC和MinGW的结果也不一致。

复制代码

CPP

a=1;

b=a a a a

//MSVC:b=5 5 5 5=20

//明明: b=3 3 4 5=15

a=1;

b=a a a a

//MSVC:b=2 3 3 4=12

//MinGW:b=3 3 3 4=13

根据以前的一些解释,我相信你现在可以推断出MSVC的结果。

然而,MinGW的结果可能仍然让人感到奇怪:它实际上让前两个A执行将A加1的运算,然后后两个A将照常处理,所以最后b=3 3 3.

好吧,让我们到此为止,建议不要纠缠这些细节,因为这种写作是不推荐的。你需要知道的是,当多个前缀和后缀一起使用时,结果是不确定的。

总的来说,-是一把双刃剑。此外,它在编码过程中不是必不可少的,所以被Swift和Python抛弃是正常的。

关于编译

人们经常看到有人说汇编语言是古代的一种编程语言,这是没有用的。有些人甚至说CC是一种如此古老的语言,以至于它没有学习价值。我个人不同意这些观点。掌握汇编语言可以更好地理解代码的本质,消除一些基本的知识错误。uuuuuuu。

由于时间和空间的原因,本文没有详细解释每个汇编代码的功能。如果你对组装感兴趣,请参考以下图片。

以前,一些编译教程是在b站上传的,需要它们的小伙伴可以向公众发送两个编译字来获得教程地址。

最后一个思考的问题

最后,留下一个思考的问题,你可以直接对思考的结果发表评论。

不是说Python不支持自动递增()自动递减(-)运算符,为什么下面的Python代码能成功运行?

复制代码

大蟒

a=10

b=a

c=a a

如果你特别想让我写点什么,你也可以留言,谢谢。

原地址:https://www.cnblogs.com/mjios/p/12674242.html