【问题标题】:Difference between literal constant & normal variable?文字常量和普通变量之间的区别?
【发布时间】:2013-02-25 04:47:54
【问题描述】:

我正在学习 C 编程,我的书说,与变量不同,常量在程序执行期间不能更改。并且它们是两种类型的常量 Literal 和 Symbolic。我认为我非常了解 Symbolic。但是字面常量让我感到困惑。 它给我的例子是

int count = 20;

我写了这个简单的程序,我可以改变字面常量的值。

/* Demonstrates variables and constants */
#include <stdio.h>

/* Trying to figure out if literal constants are any different from variables */
int testing = 22;


int main( void )
{
    /* Print testing before changing the value */
    printf("\nYour int testing has a value of %d", testing);

    /* Try to change the value of testing */
    testing = 212345;

    /* Print testing after changing the value */
    printf("\nYour int testing has a value of %d", testing);

    return 0;
}

它输出了这个:

  Your int testing has a value of 22
  Your int testing has a value of 212345
  RUN SUCCESSFUL (total time: 32ms)

有人能解释一下这是怎么发生的吗,我说错了吗?或者普通变量和字面常量有什么区别?

-谢谢

【问题讨论】:

    标签: c


    【解决方案1】:

    文字常量是20。可以更改count 的值,但不能将20 的值更改为例如19

    (作为一些琐事,有一些版本的 FORTRAN 可以做到这一点,所以谈论它并不是毫无意义的)

    【讨论】:

    • 有趣的事实:你可以在 Java 中通过反射来做到这一点。 (和 FORTRAN 一样,只是用 FORTRAN 的人不多)
    • @Ryan Amos 哇,你也可以用 Java 做吗?你学到的东西:)
    • 好的,有道理,谢谢!
    • 是的,我记得一个带有顽固错误的旧 FORTRAN 程序。最后追查到声明1 = 2,本来是I = 2
    【解决方案2】:

    本例中的文字是数字22(后来是数字212345)。您将此文字分配给变量testing。这个变量是可以改变的。

    当涉及到字符串和字符串文字时,这有点棘手。如果你有一个指向字符串字面量的指针,你可以将实际指针更改为指向其他字符串,但你可以更改原始指针指向的内容。

    例如:

    const char *string_pointer = "Foobar";
    

    根据上面的定义,你可以做例如string_pointer[0] = 'L';,因为这是试图修改指针指向的文字字符串


    根据上下文,符号常量可以是声明为 const 的“变量”或预处理器宏。

    【讨论】:

    • 但是通过一些 C 实现,您可以将指针转换为非 const 版本并修改文字“Foobar”——一些程序在过去半有意地这样做(在“const”之前甚至是一个关键字)。然而,在大多数当前的 C 实现中,文字将在写保护的存储中,尝试修改它会导致陷阱。
    • @HotLicks 修改字符串文字(例如,通过丢弃 const)是未定义的行为。它可能导致陷阱,它可能起作用,或者它可能做一些完全不同的事情。
    • 当我开始使用 C 时,它是所有“未定义的行为”——唯一的“标准”是 K&R,这足以描述基本语言。
    【解决方案3】:

    C 中的字面常量本身就是任意数字,例如你的20。你不能通过 20 = 50; 来改变它。这是违法的。

    还有常量变量,例如const int blah = 42;。你不能通过像blah = 100; 这样的操作来改变这个blah

    但是如果你有一个正常的、非常量的变量,例如int foo = 123;,您可以更改它,例如foo = 456;.

    【讨论】:

      猜你喜欢
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2021-08-27
      相关资源
      最近更新 更多