【问题标题】:How to change or modify value of const variable? [closed]如何更改或修改 const 变量的值? [关闭]
【发布时间】:2021-12-27 10:24:49
【问题描述】:
#include<stdio.h>
void main() {
  const int convalue=64;
  int *point;
  point = &convalue;
  (*point)++;
  printf("address of point is %p address of convalue is %p\n",point,&convalue);
  printf("convalue is %d and point is %d\n",convalue,*point);
}

如何修改常量变量值

【问题讨论】:

  • 您不能也不应该修改const 变量的值。
  • 这是针对 C 还是 C++ 的?选择一种语言 - C 和 C++ 在技术上是不同的语言。
  • 根据您的平台,编译器可能会将convalue 放在可执行映像的只读内存部分中。随后,在运行时,您的内存写入操作将导致内存访问冲突。
  • 你为什么要这样做?

标签: c variables constants


【解决方案1】:

如何修改常量变量值

您不能在初始化后更改常量1 的值。这就是“恒定”的意思。

您可以通过删除 const 限定符来更改程序。然后您可以更改该值。或者,您可以在初始化期间有条件地选择另一个值。

1除非常量是类类型,否则你可以改变对象的可变成员。


void main()

pogram 格式不正确。 main 必须在 C++ 中返回 int。它可能不会返回void

point = &convalue;

pogram 格式不正确。指向 const 的指针不会隐式转换为指向非 const 的指针。语言的类型系统可以防止你犯这样的错误。

(*point)++;

程序的行为未定义。不得修改 const 对象。这是一个错误。不要在程序中写这个。

【讨论】:

  • 不,有办法修改
  • @jaswanth 不,没有。
  • @jaswanth 你创建了一个const 变量,但你想改变它。这样做的理由是什么?
【解决方案2】:

我们不能也不应该尝试修改const 变量的值。还有,

任何修改 const 对象的尝试都会导致未定义的行为

还有,

请注意,未定义的行为意味着任何事情都可能发生包括但不限于程序被成功编译并给出预期的输出。但是不要依赖具有未定义行为的程序的输出。

有关未定义行为的更多信息,您可以参考undefined behavior's documentation,其中提到:

对程序的行为没有限制。

错误 2

您的程序(在 C++ 中)中还有另一个错误(除了未定义的行为)。特别是,你应该更换

int *point;//INCORRECT

const int *point;//CORRECT, note i have added const here

错误 3

您应该将void main() 替换为

int main()

因为 void main() 不是标准 C++,因为 Bjarne Stroustrupthis article 中非常清楚地说明了这一点

void main() 的定义不是,也从来不是 C++,甚至也不是 C。

【讨论】:

  • 是的,但它在 gcc 中有效
  • @jaswanth 正如我所说,未定义的行为意味着任何事情都可能发生,包括但不限于程序被成功编译。那就是你的程序中仍然有未定义的行为,你不应该依赖它的输出。
  • 在 C 标准中“未定义的行为”并不意味着任何事情都可能发生。这意味着 C 标准对发生的事情没有任何要求。不同之处在于 C 标准没有删除其他事物强加的要求,包括操作系统、硬件规范、产品安全法、物理或逻辑。这些其他事情的要求仍然存在,防止“任何事情”发生。
  • void main() 常用于嵌入式编程,从主函数返回没有意义。
  • @Cosinus void main() 不是标准 C++。特别是,一个符合规范的实现可以提供更多版本的 main(),但它们都必须具有返回类型 int。 main() 返回的 int 是程序向调用它的“系统”返回值的一种方式。在不提供此类工具的系统上,返回值被忽略,但 不生成 void main() 合法 C++ 或合法 C。即使您的编译器接受 void main() 在任何情况下都避免它。这是不正确的。
【解决方案3】:

很简单——你不能。 “常数”是常数。
如果需要,您必须使用变量。

无论如何,有一种可能得到你(也许)想要的东西——预处理器。问题有点奇怪,我想你应该会满意的。

使用预处理器可以确定 const 的初始值是多少。 (还有更多,但不是这种情况。)在它初始化后你仍然不能修改它,但也许它对你来说就足够了。例如:

#include<stdio.h>
void main() {

  const int convalue=
  #ifdef CLI_PROVIDED
    CLI_PROVIDED;
  #undef CLI_PROVIDED
  #else
    64;
  #endif

  int *point;
  point = &convalue;
  (*point)++;
  printf("address of point is %p address of convalue is %p\n",point,&convalue);
  printf("convalue is %d and point is %d\n",convalue,*point);
}

正常编译会将 const 初始化为 64。使用选项 g++ -DCLI_PROVIDED=123 进行编译将在编译之前修改 const 的初始值(这只是文本操作),然后使用值 123 进行编译。 预处理器在编译前处理代码。

如果您想(例如)为多个操作系统创建程序,它将很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多