# 语言差异 (坑)

# 运算

# 算术运算:浮点除和整除

Python3中1/2答案是0.51//2答案是0

Python2中1/2答案是0

# 算术运算:负数求模

考虑-1 % 5,不同语言的行为不一致,Python中结果是4,C++中结果是一个负数。

# 逻辑运算:比较运算

在Python中4 > 3 > 1返回的是True,所以Python可以写出0 <= i < N的代码。

# 位运算:算数右移和逻辑右移

算数右移高位补0或1,逻辑右移最高位补0。

C++对无符号数采用逻辑右移、对有符号数采用算数右移。

Java没有无符号数用于区分,所以用a >> 1表示算术右移、a >>> 1表示逻辑右移。

Python是无限范围的大数,所以没有逻辑右移。

# 赋值运算

我们希望将一个链表的元素移到另一个链表的末尾:tail.next = p; tail = tail.next;

【错误示范】很自然地使用 Python 的连续赋值:tail = tail.next = p,这样相当于 tail = p; tail.next = p

【正确示范】C/C++ 连续赋值:tail = tail->next = p;

这个差异的原因在于:

  • Python 是赋值语句 (statements)
  • C/C++ 是赋值表达式 (expressions)

# 数据类型

# 真值和假值

Python3将空数组当做假值,所以not []返回True。利用这点,可以很方便地判断入参。

# 数据结构

# 字典

字典有两种实现:Hash Map、Tree Map。

前者是用Hash表实现的,优点是O(1)时间复杂度。后者是用二叉搜索树实现的,优点是有序。

Python中只有hashmap:m = {key: value}

Java有HashMapTreeMap两个类。

C++中有std::unordered_mapstd::map两个类。

C#中有Dictionary<TKey, TValue>HashTableStringDictionarySortedDictionary

# 集合

集合有两种实现:Hash Set、Tree Set。同字典。

Python中只有hashset:m = {1, 2, 3}

Java有HashSetTreeSet两个类。

C++中有std::unordered_setstd::set两个类。

C#中有HashSetSortedSet两个类。