常量增量

标签 c pointers

<分区>

考虑以下两种情况。 case1: 编译器错误 --> error: increment of read-only variable ‘x’

    #include<stdio.h>
    main()
    {
    const int x=5;
    printf("%d",++x);
    }

案例 2:运行成功,输出为 6。为什么?

   #include<stdio.h>
   main()
   {
   const int x=5;
   int *ptr=&x;
   ++(*ptr);
   printf("%d",x);
   }

最佳答案

int *ptr=&x; 是约束违规,即“错误”,无效代码。 C语言不支持const int *类型到int *类型的隐式转换。您的编译器肯定为此发出了诊断消息。

在该诊断消息之后,您的程序的行为不再由 C 语言定义,假设您的编译器以某种方式同意编译它。许多 C 编译器可以配置为拒绝编译此代码,即使它们在默认模式下接受它也是如此。

您可以使用强制转换来强制转换

int *ptr = (int *) &x;

这将消除上述约束冲突。编译器现在必须接受您的代码(有一些注意事项)。但在修改之后,尝试执行 ++*ptr 将触发未定义的行为,因为它是尝试修改 const 对象。

关于常量增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39910141/

相关文章:

c++ - 学习重载运算符。获取 "non-standard syntax; use ' &' to create a pointer to a member"错误

c++ - 指针和引用之间的底层区别是什么?

c - 在函数中查找字节的确切位置

c - 在 C 中使用 win32 在父线程中创建未知数量的子线程?

c - "aborted (core dumped)"在所有程序中

c++ - move unique_ptr 后,指向 unique_ptr 内容的指针的内容是否有效?

c - 如何将 2 个数组合并为一个数组

c - 什么是二进制文件的 EOF?健康)状况?特点?

C++ 指针/列表实现

c++ - 如何在循环 C++ 中创建唯一指针?