为什么斯威夫特和蟒蛇放弃?
简单易用,-
当谈到自增()和自减(-)运算符时,我的朋友应该很熟悉它们。它们经常出现在许多编程语言的代码中。
例如,常用于语句
复制代码
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
发表评论