我在C#,java中找到了很多关于数据类型可变性的信息......但是纯粹的C.
例如,int默认情况下在C中是不可变的吗?
例如,查看以下代码示例:
#include <stdio.h>
int main()
{
int a,b,c;
b=0;
c=0;
a=b+c;
b=1;
c=2;
printf("1st time %d\n",a);//gives out 0
c=3;
printf("2nd time %d",a);//gives out 0
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码表明普通int是不可改变的,对吗?
[I]s int mutable in C?
简短的回答:是的!
如果你问是否有可能改变C中的任何内存位置,答案是肯定的.(有时候会产生危险的后果!)虽然可以设计一个不能通过你为它创建的API直接变异的数据结构,但你几乎可以覆盖纯C中的任何内存位置.
难怪有人喜欢它,有些则不喜欢.
编辑
关于Roger上面的评论:
#include<stdio.h>
int main (int argc, char *argv[]) {
const int n = 1;
int *m = &n;
*m = 10;
printf ("%d\n", n); /* prints 10 */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,是的,有可能覆盖偶数const ints 的内存位置.
平凡int是可变的。一个实体(不仅声称在某个时刻存在,而且“确实存在”)const在理论上是不可变的,并且如果硬件和软件配合,实际上通常也是不可变的。
使用限定符定义变量const使其“真正”成为 const:
const int c3 = 3;\nvoid f(void) {\n const int c4 = 4;\n ...\n}\nRun Code Online (Sandbox Code Playgroud)\n\n使用“棘手”代码(抛弃常量性),您可以说服系统写入或尝试写入新值到c3and/or中c4:
void f(void) {\n const int c4 = 4;\n int *p;\n\n p = (int *)&c3;\n *p = 99;\n printf("c3 is now %d\\n", c3);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果您调用f(),您可能会在某些系统上发现 c3 发生变化并变为 99。在其他系统上,您可能会遇到“分段错误”或其他运行时错误。
更改要使用的引用c4,可能会发生相同的情况\xe2\x80\x94,尽管在实践中,很少有系统会产生运行时错误。c4 is now 99然而,您可能会观察到完全不同的东西:您可能会得到,而不是打印c4 is now 4。
最后一种情况可能会发生,因为编译器可以假设,在创建了值为 4 的c4a后const int,您(程序员)从未更改过它。这*p = 99一定不会改变它(即使改变了),因此printf可以用仅打印 4 的不同调用来替换对 的调用。
对 的引用通常也是如此c3:编译器可以假设,由于您承诺永远不会更改它,所以您实际上从未更改过它。这可能会产生令人惊讶的结果,例如:p == &c3为 true、c3为 3 和*p为 99。但是很可能会出现运行时错误,因为大多数现代编译器和操作系统都会合作坚持c3只读区域。
当字符串文字生成数组时(大多数情况下),C 有一个怪癖。这些数组不是const- 限定的,但组成数组的字符无论如何都是只读的(至少原则上,与 一样const int c3 = 3;)。就像c3,大多数现代系统都设法使它们“真正只读”。
(当字符串文字用作 类型的对象的初始值设定项时,不会生成数组array of char。比较:
char *ronly = "this string is read only";\nchar rwarray[] = "this string is read/write";\nRun Code Online (Sandbox Code Playgroud)\n\n这ronly是一个指针,而不是数组,因此字符串文字生成一个数组并ronly指向该数组的第一个字符。底层数组是只读的,即使其类型是char [25]。但是rwarray是一个数组,而不是指针,因此字符串文字将其填充到 \xe2\x80\x94 中,并将其大小设置为 26\xe2\x80\x94 并且它是可变的。您必须编写const char roarray[] = ...以使其不可变。[有些人喜欢拼写 type char const [],将 const 放在 data-type 之后。这些意思是一样的。])
| 归档时间: |
|
| 查看次数: |
3464 次 |
| 最近记录: |