【问题标题】:Data Variables/Constants and Type int Constants (C Primer Plus)数据变量/常量和类型 int 常量(C Primer Plus)
【发布时间】:2019-12-30 05:18:41
【问题描述】:

世界。我是 CS 领域的新手,通过一本名为“C Primer Plus”的书学习 C 语言。 我有一个关于 C 数据类型的问题(本书的第 3 章)。

书上是这么写的

数据变量和常量

[...] 某些类型的数据在使用程序之前已预设,并在程序的整个生命周期内保持其值不变。这些是常量。其他类型的数据可能会随着程序运行而改变或被赋值;这些是变量。在示例程序中,weight 是一个变量,14.5833 是一个常数。 [...] 变量和常量之间的区别在于,变量可以在程序运行时分配或更改其值,而常量则不能。

以下是示例程序。

/* platinum.c -- your weight in platinum */
#include <stdio.h>
int main(void)
{
    float weight;
    float value;

    printf("Are you worth your weight in platinum?\n");
    printf("Let's check it out.\n);
    printf("Please enter your weight in pounds: ");

    scanf("%f", &weight);
    value = 1700.0 * weight * 14.5833;
    printf("Your weight in platinum is worth $%.2f.\n", value);
    printf("You are easily worth that! If platinum prices drop,\n");
    printf("eat more to maintain your value.\n);

    return 0;
}

接下来,

数据:数据类型关键字

除了变量和常量的区别之外,还有不同类型数据的区别。 [...] 如果一个数据是一个常量,编译器通常可以通过它的外观来判断它的类型。 [...] 但是,变量需要在声明语句中声明其类型。 [...]


在我阅读以下内容之前,一切对我来说都是有意义的。

初始化变量

initilize 一个变量意味着为它分配一个起始值,或initial。 [...] 以下是一些示例:

int hogs = 21;
int cows = 32, goats = 14
int dogs, cats = 94;        /* valid, but poor, form */

以下是,

类型 int 常量

上例中的各种整数(21、32、14 和 94)是整数常量,也称为整数字面量


这让我很困惑,因为我的理解是常量和变量是不同的。区别之一是声明其类型或不声明。但是声明语句中初始化变量的值称为整数常量。

现在我的问题是
1.为什么数据常量和整型常量/字面量有区别?
2.它们有什么不同?
3.我错过了什么?

感谢您的阅读。

【问题讨论】:

  • 好吧,如果你的代码中有21(它是一个整数文字),你不能把它放在等号的左边。例如21 = 32; 没有意义。常数也是一样的,例如const int foo = 21; 你不能这样做foo = 32;。现在要注意的重点是foo 不是整数文字,但不能修改。要提供命名整数文字,您必须#define FOO 21。重要的是 foo 直到运行时才知道,而 FOO 在编译时才知道。如果您尝试int arr[foo];int arr[FOO];,这会有所不同
  • “我错过了什么?”“为什么重要?” 部分。从概念上讲,您并没有遗漏任何东西(您可能有点想多了)。但是“为什么重要?” 部分归结为编译时已知的内容和运行时已知的内容。定义的常数,例如#define FOO 21 使 FOO 在编译时已知。它可以用作定义数组的有效文字,例如int arr[FOO]; 等。虽然简单的 const int foo = 21; 直到运行时才知道,即使声明的 const 不是文字。 int arr[foo]; 会生成一个可变长度数组
  • 你是对的。我想多了。谢谢。
  • 发生在我们所有人身上——但你问的问题是正确的:)

标签: c variables int constants literals


【解决方案1】:

为什么数据常量和整数常量/字面量有区别?

没有。整数常量是数据常量的类型。这些声明语句正在初始化具有常量值的变量 - 给定

int hogs = 21;

变量hogs 将包含值21 - 我们已将常量的值复制到变量中。

这里有更多例子:

double     d = 1.234; // copy the value 1.234 into d 
char       c = 'a';   // copy the character value 'a' into c
char   str[] = "foo"; // copy the contents of the string "foo" into the array str - size of the array is taken from the size of the initializer.

整数、浮点和字符串常量可以有后缀,告诉编译器使用特定类型,而不是假设intdouble 或其他。 1234U 表示“将1234 视为一个无符号 整数”,3.1415f 表示“将3.1415 视为float,而不是double”等。你可能不会不过,还不需要担心这一点。

那么,为什么类型 很重要

不同的类型在内存中有不同的表示 - 整数值1234 的位模式看起来没有类似于浮点值1234.0 的位模式,它看起来不像 string "1234" 的位模式。如果我们尝试将字符串值存储在整数变量中并尝试将其用作整数,我们的程序将不会按预期运行。所以编译器有规则阻止我们将 incompatible 类型的值分配给变量。

让我们回到我们的变量初始化:

int hog = 21;

我们告诉编译器变量hog 的类型为int,并且我们正在用常量表达式初始化它。为了让编译器接受这一点,常量表达式also 需要具有int 类型(或与int 兼容的类型)。如果我们写

int hog = "21";

编译器会抱怨我们试图用错误类型的值初始化hog

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多