- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我知道“可变”和“不可变”是应该用来描述对象改变诸如Java和Objective C之类的面向对象语言中的值的能力的术语。但是,我想提出它,因为它与我的语言有关有关原始数据的问题。我知道,当我更改持有不可变对象的变量的值时,实际上是在创建一个新对象。但是,我想知道C中的基本数据的行为是否类似于不可变对象。我的意思是,当我更改保存原始数据的变量的值时,将创建新数据并由该变量引用。还是现有的原语实际上改变/修改了存储的数据值?
编辑#1:
问题#1:我想消除一些误解(无论是对我本人还是其他人),因为当我说“当我更改持有不可变对象的变量的值时,我实际上并不明确创建一个新对象。”当我这么说时,我并不是要将变量分配给现有对象。例如:
// Example 1: I did not mean this
-------------------------
String x = "Hello World";
String y = x;
-------------------------
// Example 2: What I meant is this
-------------------------
String x = "Hello World";
//This will print out "Hello World"
System.out.println(x);
x = "Goodbye World";
//This will print out "Goodbye World"
System.out.println(x);
-------------------------
-------------------------
int x = 10;
x = 2;
-------------------------
-------------------------
int x;
int *ptr;
ptr = &x;
*ptr = 1;
-------------------------
最佳答案
理解C的工作方式的最佳方法是将其视为高级汇编语言。变量只是内存中的位置,将值分配给变量会将值存储到该位置。从高级语言的角度来看,这将是最纯粹形式的变异。
在C中,声明/定义如
int x;
int
变量
x
保留一些内存。 (在函数内部,内存将来自堆栈。在全局范围内,它将来自数据段。)
x = 7;
x = y;
int
的存储位置中存储的
y
值复制到
x
的存储位置中。 (假设
y
是另一个
int
。)
int
更复杂的类型。
&
运算符用于获取C语言中变量的地址,因此
&x
将是
x
的地址。
*
运算符在应用于指针时会提供指向的对象。这是一个如何在不同时间使用指针来引用不同变量的示例:
int x;
int y;
/* Declares 'ptr' as a pointer, and says that it points to an int.
The pointed-to type is used by the compiler for type checking
and type conversions. */
int *ptr;
ptr = &x; // Store the address of 'x' in 'ptr'.
*ptr = 1; // Store 1 into the memory 'ptr' points to ('x').
ptr = &y; // Store the address of 'y' in 'ptr'.
*ptr = 2; // Store 2 into the memory 'ptr' points to ('y').
x
设置为1并将
y
设置为2。这当然是一个愚蠢的示例,但希望它能使您理解。
//
-style注释。)
x = "Goodbye World";
x
引用值为“Goodbye world”的
String
对象。确切地说,创建此
String
对象的时间不应该有所不同,只要在将其分配给
x
(或任何其他变量)之前创建该对象即可。
ptr
是一个指针”比说“
*ptr
是一个指针”更正确。C中存在一些语法上的晦涩之处,这使得将
*
放在声明(IMO)中的名称之后更加自然,但是您也可以在这种情况下编写类似于
int* ptr;
的声明。只有在同一行中声明许多变量时,事情才会变得怪异。)
x = 1;
x
的指针字段中。这样的技术很普遍。
union
可以在C语言中用于将两种不同的类型(例如
int
和指针)存储在内存中的同一位置,以便它们重叠。当然,分配给其中一种类型也会改变另一种类型的值。
关于java - 在C语言中更改变量的值时,是创建新的原语还是当前原语被突变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29247824/
我对 JS 还很陌生,目前正在学习对象,对原语有点困惑。在 W3schools 上,javascript 原语定义为: “原始值是没有属性或方法的值。 原始数据类型是具有原始值的数据。 JavaScr
我可以用 java 做这个吗? private static boolean isRight(){ return new Random.nextBolean(); } boolean test
OpenCV 原语是否基于 CUDA Nvidia 性能原语 (NPP)? 我所说的原语是指在 NPP 库中实现的相同原语,例如:boxFilter、Mirror、Convolution... 我想知
这个问题在这里已经有了答案: How many integers can I create in 1GB memory? (3 个答案) 关闭 6 年前。 引用自 Algorithms 4th ed
我正在尝试编写我的第一个显示三角形的 DirectX 10 程序。一切都编译得很好,渲染函数被调用,因为背景变成了黑色。但是,我尝试使用三角形 strip 基元绘制的三角形根本不显示。 初始化函数:
什么是 UI 原语? if you find yourself wishing that you had a different set of UI primitives to work with,
我知道这个问题已经在 Stakoverflow 中被问过多次。但是没有一个解决方案对我有帮助。谁能告诉我做错了什么 我有一个 Controller Action 如下 Function WF
我正在尝试从一个程序中读取一个二进制文件,该程序将日志(某种)写入一个dat文件,我已经很好地找到了使用Java的格式。我这样加载它: DataInputStream in = new DataInp
我有代码对 MVC Controller 方法进行 AJAX 调用,如果我这样做,它会顺利工作: var obj = '{"titlename":"whatever"}'; $
我有一个对象: class Data{ int a; int b; AtomicIntegerArray c = new AtomicIntegerArray(10000); }
我的应用程序具有以下 Javascript 原语: var bearerToken = "a"; var expirationDate = "b"; var firstName = "c"; var
我经常发现自己需要让组件接受任何有效的 HTML 属性以使底层 HTML 元素使用它们。 class Input extends React.Component { // Here I use o
我尝试使用 javascriptserializer 反序列化我的 json,但收到错误“无效的 json 原语” 其他帖子提到要验证 json,我也这样做了。 JavaScriptSerialize
有没有办法制作一个原语并反复使用它?例如:如果我制作一个立方体,我可以创建 100 个立方体并制作一个 10x10 的网格吗?我试过使用 for 循环并在每个循环中更新 x 和 z 坐标,但它只移动在
扩展和装箱 Java 原语。 我知道不可能将包装类从一个扩展到另一个,因为它们不是来自同一继承树。为什么不能将基元扩展为另一种基元类型并自动装箱扩展的基元? 鉴于可以将字节参数传递给需要 int 的方
你能帮我解决这个问题吗?我有一个 asp.net 应用程序,在此我使用 Javascript 序列化程序序列化数据集,然后转换为列表。该代码如下所示。 JavaScriptSerializer jso
好的,所以当我尝试运行我的应用程序时遇到这个问题: Invalid JSON primitive: . public static void ReloadConfig() { if (!Fil
我正在尝试通过以下 jQuery Ajax 调用将字符串化的 JSON 对象发送到 MVC 方法: $.ajax({ type: "POST", url:
当我在 C# 中使用 JavaScriptSerializer 时,出现“无效的 JSON 原语”异常。我假设问题出在我的 json 输入字符串上,但我没有看到问题。 JavaScriptSerial
我知道您可以直接从 Scala 访问 java 原语 val javaDouble = new java.lang.Double(1.0) 这是否意味着我们正在通过包装器或直接访问原语?语法 new
我是一名优秀的程序员,十分优秀!