我们常说变量用于保存值。但其实不是这样的,变量是指内存中某些数据的友好可读的名称。

您可以将内存视为一个巨大的字节数组。数据存储在这个数组中。如果一个数字大于单个字节,则它存储在多个字节中。

因为内存就像一个数组,内存的每个字节都可以通过它的索引来引用。这个内存索引也称为地址、位置或指针。

当你在 C 语言中有一个变量时,该变量的值在内存的某个地址的某个地方。但是通过数字地址来引用一个值是一件很痛苦的事情,所以我们为它起一个名字,这就是变量的含义。

这里提出这个的原因有两个:

  1. 这将使以后更容易理解指针变量——它们是保存其他变量地址的变量!
  2. 此外,这将使以后更容易理解指针。

因此,变量是存储在内存中某个地址的某些数据的名称。

变量名

您可以使用 0-9 、A-Z、a-z 和下划线范围内的任何字符作为变量名称,且需要遵循以下规则:

  • 变量不能以数字 0-9 开头。
  • 变量名不能以两个下划线开头。
  • 变量名不能以下划线开头,后跟大写的 A-Z。

变量类型

根据您你所学习的语言,您可能熟悉也可能不熟悉类型的概念。但是 C语言对数据类型非常严格,所以我们应该复习一下。

这是一些最基本的数据类型:

类型 例子 C 语言
整数3490int
浮点3.14159float35
单个字符'c'char
字符串"Hello, world!"char *36

当您需要时,C语言会努力在大多数数字类型之间自动转换。除此之外,所有类型转换都是手动的,特别是在字符串和数字之间。

在 C 语言的其它类型都是这些基本类型的变体。在使用变量之前,您必须声明该变量并告诉 C 语言变量是什么类型。

一旦声明,变量的类型就不能在运行时修改。你将它设置为什么,它就是什么,直到变量离开当前作用域并被重新被回收。

让我们使用之前的 Hello, world 代码并向其中添加几个变量:

#include <stdio.h>

int main(void)
{
    int i;    // 有符号整型, e.g. -3, -2, 0, 1, 10
    float f;  // 有符号浮点数, e.g. -3.1416

    printf("Hello, World!\n");  
}c

这里我们声明了几个变量。我们还没有使用它们,它们都未初始化。一个保存整数,另一个保存浮点数。

未初始化的变量具有不确定的值。它们必须被初始化,否则变量就会包含一些无意义的数字。大多数时候,根据前人经验,你应该始终明确地将变量初始化为某个值。

int main(void)
{
    int i;

    i = 2; // 分配值 2 给 变量 i 

    printf("Hello, World!\n");
}

现在我们存储了一个值。让我们将它打印出来。

我们将通过向 printf() 函数传递两个惊人的参数来做到这一点。第一个参数是一个字符串,描述要打印什么以及如何打印它(称为格式字符串),第二个参数是要打印的值,即 i 变量中的任何内容。

printf() 在格式字符串中寻找各种特殊字符,这些字符以百分号 % 开头,告诉它要打印什么。例如,如果找到 %d,它会查找传递的下一个参数,并将其作为整数打印出来。

如果它找到一个 %f,它会将值作为浮点数打印出来。如果它找到一个 %s,它会打印一个字符串。这种以百分号 % 开始的通常称为占位符。

因此,我们可以像这样打印出各种类型的值:

#include <stdio.h>

int main(void)
{
    int i = 2;
    float f = 3.14;
    char* s = "Hello, world!";  // char* ("char指针") 也就是其它语言常说的string

    printf("%s  i = %d and f = %f!\n", s, i, f);
}

输出将是:

Hello, world!  i = 2 and f = 3.14!

printf() 可能类似于您熟悉的其他语言中的各种类型的格式字符串或参数化字符串。

C 语言占位符

在这里,我们列出一些占位符号,使用频率可以说是从高到低。

占位符用于数据类型
%c打印单个字符char,  unsigned char
%d打印整形short,  unsigned short,  int ,  long
%i以十进制,八进制,十六进制打印整形short,  unsigned short,  int ,  long
%e打印浮点数float,  double
%f打印浮点数float
%g打印浮点数float,  double
%o打印八进制short,  unsigned short,  int,  unsigned int,  long
%s打印字符串char*
%x打印十六进制short,  unsigned short,  int,  unsigned int,  long
%p打印指针void*
%n作为数值字符形式打整形值 
%u打印无符号整形unsigned int,  unsigned long
%[ ]扫描字符的集合 
%%打印百分比 
%hi打印有符号 short short
%hu打印无符号 shortunsigned short

布尔类型

C 有布尔类型,真还是假?从历史上看,C 没有布尔类型,有些人可能会争辩说它仍然没有。在 C 语言,0  表示“假”,非零表示“真”。事实也是如此。1 或者 -37 都是真的。并且 0 是假的。

您可以将布尔类型声明为 int 类型:

int x = 1;

if (x) {
    printf("x is true!\n");
}

如果你 #include <stdbool.h>,你还可以访问一些可能使事情看起来更熟悉的符号名称,即 bool 类型  falsetrue 值 :

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    bool x = true;

    if (x) {
        printf("x is true!\n");
    }
}

但这些与使用整数值表示 true 和 false 相同。它们只是让代码看起来更加简洁。