简而言之,从 C 语言来看,数组和字符串文字是不可修改的左值。
C 中的“不可修改”是否与编程语言(例如 Python、Java 和函数式语言)中的“不可变”意思相同?
在编程语言设计中,数组的“不可修改”和“不可变”是否意味着其元素/项目相同?
为什么我们可以在 C 中修改数组和字符串文字中的元素的值,而我们不能在 Python 中修改字符串中的项目?
谢谢。
最佳答案
根据您对问题的措辞——指的是“不可修改的左值”——我认为答案是:不,不可修改的与不可变的不同,至少在您正在阅读的书的上下文中是这样. “不可变”是面向对象语言中对象的一个属性。 (在 C 中,我认为 const
对象也被认为是不可变的。)“左值”更多地与编译器如何对表达式进行分类有关。按照我的理解,“左值”是指代对象的表达式,而“右值”则不是。您不能将右值放在赋值的左侧。大多数左值都可以赋值,但有些不能。根据语言规则,字符串文字被视为左值,但您不能说 "abc"= "xyz";
。这就是为什么它被认为是不可修改的左值。
http://ieng9.ucsd.edu/~cs30x/Non-modifiable%20Lvalues.htm很好地解释了这一点。除其他外,作者说
Notice that I did not say a non-modifiable lvalue refers to an object that you can't modify-I said you can't use the lvalue to modify the object.
C 实际上可以让你修改任何东西,如果你知道怎么做的话。如果无法修改 C 中的某些内容,那是因为硬件和/或操作系统不允许。如果您运行的嵌入式系统没有内置的方法来防止写入一定范围的内存,那么您可以修改任何内容,包括您自己的代码。这里的要点是,在 C 语言中没有任何内容使得尝试修改字符串文字是非法的。
相比之下,在 Java 和 Python 中,字符串是对象,因此您可以对它们执行的唯一操作是为字符串类定义的操作。而且这些类根本不提供允许您修改字符串的方法。这就是不可变的意思。这是一个适用于对象的术语,而您对“不可修改”的使用实际上仅适用于某些语法类别的表达式。所以你根本不能把两者等同起来。
关于java - C中的 "nonmodifiable"和其他编程语言中的 "immutable"意思一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46188189/