簡體   English   中英

C語言中的“不可修改”是否與其他編程語言中的“不變”相同?

[英]Does “nonmodifiable” in C mean the same as “immutable” in other programming languages?

從C的簡而言之,數組和字符串文字是不可修改的左值。

C語言中的“不可修改”是否與編程語言(例如Python,Java和功能語言)中的“不變”相同?

在編程語言設計中,數組的“不可修改”和“不變”是否暗示其元素/項目相同?

為什么我們不能在Python中修改數組元素和字符串文字的值,卻不能在C中修改字符串中的項呢?

謝謝。

C語言中的“不可修改”是否與編程語言(例如Python,Java和功能語言)中的“不變”相同?

是。

在編程語言設計中,數組的“不可修改”和“不變”是否暗示其元素/項目相同?

不能。數組是不可變的,因為您不能修改其存儲的地址,該地址指向序列的第一個元素。 但是,您可以修改數組的元素。

為什么我們要在C中修改數組元素和字符串文字的值

停在那兒。 您不能在C中修改字符串文字。您可以修改字符串的地址,但不能修改字符串本身。

這是一個小程序來演示數組和字符串文字之間的區別:

int main(){
  char* a = "somestring";
  char* b = "oldstring";
  char c[] = "somestring2";
  b = a;//OK, you modified the address. Now it stores the address of the first char from string a
  *b = 'l';//not OK, you modified the string(its first character)
  c = a;//not ok, you're changing the address the array holds
  *c = 'j';//OK, modifying array's elements(first char)
}

根據您對問題的措辭方式(指“不可修改的左值”),我認為答案是:不,至少在您所閱讀的書本中,不可修改與不變是不同的。 “不可變”是面向對象語言中的對象的屬性。 (在C語言中,我認為const對象也將被視為不可變的。)“ lvalue”與編譯器如何對表達式分類有關。 以我的理解,“左值”是指向對象的表達式,而“右值”不是。 您不能在任務的左側放置右值。 可以將大多數左值賦值給,但是有些不能。 根據語言規則,字符串文字被視為左值,但是您不能說"abc" = "xyz"; 這就是為什么它被視為不可修改的左值。

http://ieng9.ucsd.edu/~cs30x/Non-modifiable%20Lvalues.htm很好地解釋了這一點。 作者說,除其他外,

請注意,我並不是說不可修改的左值是指您無法修改的對象,而是說您不能使用左值來修改對象。

如果您知道該怎么做,C實際上將允許您修改任何內容。 如果無法修改C中的某些內容,那是因為硬件和/或操作系統不允許您這樣做。 如果您正在運行的嵌入式系統沒有內置的防止寫入內存范圍的方法,則可以修改任何內容,包括您自己的代碼。 這里的要點是,C語言中沒有任何內容使嘗試修改字符串文字非法。

相反,在Java和Python中,字符串是對象,因此,您只能對字符串類執行的操作是為字符串類定義的操作。 而且這些類根本不提供允許您修改字符串的方法。 這就是不可變的意思。 這個術語適用於對象,而您對“不可修改的”的使用實際上僅適用於某些句法表達類別。 因此,您根本無法將兩者完全等同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM