c中的整型常量是什么?

what is a integer constant in c?

我是初学者,正在阅读 C primer plus。有一个地方我不能理解。 我知道在整个程序中不能更改常量,当我读到这个时:

Initializing a Variable:
...
int hogs = 21;
int cows = 32, goats =14;
int dogs, cats = 94;
...
The various integers(21, 32, 14, and 94) are integer constants. When you write a number without a decimal point and without an exponent, C recognizes it as an integer.

我对他说的整数常量和整数感到困惑。我想也许他说当你写这个“int hogs = 21;”时,你将 hogs 声明为一个常量。所以我自己编码来检查是否“int hogs = 21;”是否声明常量:

int main()
{
   int words = 3020, lines = 350;

   printf("there were %d words and %d lines\n", words, lines);

   words = 2;
   lines = 1;
   printf("change %d and %d", words, lines);

    return 0;

}

可以改!然后我上网查了下,我知道你应该写这个“const int hogs = 21;”声明一个常量。但是整数常量是什么?什么是“各种整数(21、32、14 和 94)是整数常量。当你写一个没有小数点和指数的数字时,C 将其识别为整数。”。它已经是一个整数,因为您编码了“int hogs =21;”。我想也许他说如果你不声明变量而直接使用一个数字,比如 10,编译器会将该数字识别为整数变量。而10就是他所说的'integer constant'。那么是这样吗?

声明int hogs = 21是常量,作者的意思只是声明了一个整型变量'hogs',并用常量值21对其进行了初始化。

与“各种整数(21、32、14 和 94)是整数常量”语句类似 - 作者的意思是其他整数变量已分别用常量值 32、14 和 94 初始化。

你对const关键字的理解是完全正确的,const关键字用于声明一个常量整型变量——只能声明一次且值不会改变的变量。

  • 21 是一个整数常量,值为 21,类型为 int.

  • 20 + 1是由整数常量201和运算符+组成的表达式,是一个整数常量表达式,值为21,类型为int。 (21 本身也是一个 整数常量表达式 。)

  • int bogs; 声明(并可能定义)bogs 为类型 int 的对象。这些命名对象也称为 variables.

  • int hogs = 21; 声明 并且 hogs 定义为 int [=46= 类型的对象(变量) ]and 用整数常量 21 的值初始化它。即值 21 最初将存储在其中。此后程序员可以通过分配一个新值给它来改变它。

  • const int cogs = 21 声明 并且 cogs 定义为 const int [=46= 类型的对象(变量) ]and 用整数常量 21 的值初始化它。 const 作为对象的一种类型表示 程序员 不打算更改的值初始化后的对象(变量)。

    但是在 C 中,cogs不是整数常量也不是整数常量表达式,它是只是一个 const int 类型的变量 (!)。区别很重要,因为有很多地方需要 整数常量表达式 并且在这些情况下 你根本不能使用任何对象的值,甚至 cogs:例如switch - case的标签,具有静态存储持续时间的数组的维度,位域的宽度等...

这里的问题是作者的演讲有点混乱,在什么被认为是整数(类型,作为从整数的数学集合中取出的一组值),整数常量(我猜猜你解释为一种不允许更改的对象,或一个命名的数字),以及一个 整数文字 (这是整数集合的值之一,喜欢 23)

作者混淆了术语,所以你很困惑。我会尽力解释:

  • 整数文字是您用来初始化或分配具体整数值的值。例如 23.
  • 一个整数常量是你不能修改的东西,但是有一个名字来引用它(一个很好的例子,它是一个整数,应该是常量 PI,但它不是一个好的整数示例 ;) 让我们考虑一个由 N 元素组成的固定数组,您希望在最后一次决定何时给它一个值,但该值在此期间不会改变程序。您有两种定义常量值的方法:
#define N 1024

在这种情况下,您让 C 预处理器始终看到标记 N,根据它的值更改它,所以它实际上是一个常量,就好像您尝试:

    N = 1023;

c 预处理器会将其扩展为:

    1024 = 1023;

并且你会得到一个编译错误,由于一个无效的语句(你不能为数字文字分配不同的值)

  • 另一种方式是最近的做法:
    const int N = 1024;

在这种情况下,编译器将创建一个变量(常量的错误名称;)),您可以在任何程序语句中引用它,但编译器不允许您修改它。如果你尝试

    N = 1023;

你会得到一个错误,告诉你 N 是一个常量对象,所以你不能修改它。

有趣的是,每个作者都将字符串文字视为引号之间的一些文本,但他们对整数文字或浮点文字的处理方式却不同。