C编程中变量的全面介绍
#初学者 #编程 #教程 #c

所有C程序,无论其大小如何,都包含功能和变量。一个函数包含指定要完成的计算操作的语句,并且变量存储了计算过程中使用的值。

在本文中,您将学习C编程中变量的含义,如何声明变量并为其分配值。您将了解不同类型的变量及其可以存储的值范围。您将了解ASCII角色集。您将学习如何使用C标准库函数printfputchar打印存储在不同类型的变量中的值。

表中的内容

先决条件

要享受本文的完整体验,您应该有以下内容:

  • 对如何使用gcc编译器编译C源文件的基本了解以及如何在终端中运行编译C源文件的输出文件。
  • 对如何使用printf函数打印文本的基本理解
  • Ubuntu 20.04 LTS安装在您的计算机上
  • 文本编辑器(最好是vim)
  • 一杯水或咖啡

本文中的每个代码均在Ubuntu上编译
20.04 LTS使用gcc,使用optoct -wall -
Werror -Wextra -pedantic -std=gnu89

C中的变量是什么?

在C中,一个变量是一个符号名称,代表硬盘上的特定存储位置或连接到机器执行的机器的任何存储设备。

“在C中,所有变量都必须在使用之前声明,通常是在函数开始时在任何可执行语句之前。” -C编程语言书(Brian W. Kernighan&Dennis M. Ritchie)

要在C编程语言中声明变量,我们首先指定变量的类型,然后指定其标识符。

/* syntax of a variable declaration in C */
Type identifier; /* declaration of a single variable */
Type identifier_1 identifier_2 identifier_N; /* declaration of multiple variables with the same Type */

什么是标识符

标识符是您为C程序中的变量,功能,宏和其他数据对象提供的任何名称。您需要提供有效的标识符。

以下列表指示您必须遵循的规则才能在C中构造有效的标识符:

  • 它必须从字母开始(下划线_算作字母)。
  • 它之间一定没有任何空间。
  • 它必须是唯一的,并且不能成为c。
  • 中的关键字
  • 它可以由大写或小写字母字符,十个数字(0-9)和下划线_组成
/* example of valid identifiers */
sum 
flag
i
Sum
mem_alloc
x5j6
SUM
/* examples of invalid identifiers */
sum$value /* $ is not a valid character */
piece flag /* Embedded spaces are not supported */
3spencer /* identifier cannot start with a number */
int /* int is a keyword in C */

大写和小写字母在C中不同。因此,sumSumSUM是不同的标识符。

编程最佳实践建议您构建反映其预期用途的标识符。

什么是类型

一种类型是一种规范,描述了标识符可以存储或操纵的值的种类。

c是一种静态打字的语言。这意味着所有标识符都必须与类型相关联。

为标识符指定的类型指示编译器的以下类型:

  • 可以通过标识符存储的值的种类
  • 可以通过标识符存储的可接受的值范围。
  • 应该分配给标识符的存储空间。
  • 应允许使用标识符执行的算术计算。

如果无法满足您指定标识符的类型,则编译器会生成错误消息。

C的基本类型

C支持三(3)种基本类型:

  • 整数类型
  • 浮动类型
  • 角色类型

要在变量声明中指定任何基本类型,我们使用C标准中为每种类型提供的专用关键字:

  • int是用于指定整数类型的关键字。
  • float是用于指定浮动类型的关键字。
  • char是用于指定字符类型的关键字。

您可能已经听到或看到人们使用术语数据类型,并想知道数据类型和类型之间的区别是什么。尽管这两个术语都可以互换使用,但它们的含义略有不同。类型是指数据类型时指规范的指定数据适合类型规范的数据。

因此,当我们在变量声明中指定A type 时,我们将指示编译器制作一个可以存储 datatypes 的变量,该变量适合适合该变量的类型的规格。

>

>

>

如何在C中声明变量

要在C编程中声明一个变量,我们首先指定变量的类型,然后指定其标识符。例如,我们可能会声明变量“高度”和“利润”为:

/* examples of variable declaration */
int height;
float profit;

第一个声明指出,height是类型int的变量,这意味着height可以存储整数。第二个声明指出,profit是类型float的变量,这意味着profit可以在小数点之后用数字存储数字。

在声明变量后,可以通过分配来初始化(给定值):

/* examples of variable declaration */
int height;
float profit;

/* initialize the variables */
height = 8;
profit = 21.50;

当您在C中声明变量时,计算机会发生什么

当您在C编程中声明一个变量时,您本质上将该变量引入程序。该声明告诉编译器在执行程序的计算机硬盘上为变量分配存储空间。

编译程序时,编译器会生成机器代码,该机器代码将指示您的计算机为程序中的每个声明变量在硬盘驱动器上分配内存的指定部分。然后,编译器随后将相应的标识符分配给分配的存储位置。该分配的内存可作为分配给变量的值的存储。

计算机的CPU体系结构确定将为每个变量类型分配的确切内存量。不同的CPU体系结构对基本C类型具有不同的内存分配规范。

内存分配规范通常在字节中定义,但机器将内存分配转换为 bits

1 Byte = 8 Bits

下表显示了将在大多数64位Linux机器上使用基本C类型声明的变量分配的内存:

类型 内存分配
char 1个字节
int 4字节
float 4字节

要获取计算机上每种基本C类型的内存分配规格,请将类型关键字作为参数传递给标准库函数sizeof并使用printf函数打印其返回值。

让我们创建一个程序,以打印出计算机上每个基本C类型的内存分配规范:

#include <stdio.h>
/**
 * main - Entry point of the program 
 * Description: Program will print the memory allocation specification 
 * for each of the C fundamental types using   
 * 
 * Return: 0 if program successfully executes
 */

int main(void)
{
    /* print the size of the C fundamental types */
    printf("Size of type 'char' on my computer is: %lu bytes\n," sizeof(char));
    printf("Size of type 'int' on my computer is: %lu bytes\n", sizeof(int));
    printf("Size of type 'float' on my computer is %lu bytes\n", sizeof(float));

    return (0);
}

My Ubuntu 20.04 LTS terminal showing the output memory allocation specification generated by running the above program

我们使用带有printf函数的格式说明符来打印存储在变量中的值。在上面的代码段中,格式指定器%luprintf函数中用于打印sizeof函数返回的值,因为其返回值是无符号的整数类型(有关此整数类型的更多详细信息将很快讨论)。

>

>

为变量声明指定类型的重要性

为变量指定的类型确定可以通过变量存储的值范围。

c认真对待可移植性(您的程序在不同类型的机器上编译的能力)认真对待,并打扰您告诉您每种类型的值范围是安全的。在以下各节中,您将了解每种类型及其值得保证的值范围的更多信息。

整数类型

整数类型变量将存储整数常数。 int是用于指定整数类型的关键字。

整数常数由一个或多个数字的序列组成。序列之前的负符号表明该值为负。数字之间不允许使用嵌入式空间,并且大于999的值不能使用逗号表示。 C允许整数常数以十进制表示法(基数10),八进制(基数8)或十六进制符号(基数16)。

小数点整数常数的符号包含0到9之间的数字,但它们不得以零开始:

/* examples of valid integer constants */
10
255
11000

八进制整数常数的符号仅包含0到7之间的数字,并且必须以零开始:

/* example of valid octal integer constants */
017
0377
077777

十六进制整数常数的符号包含0到9之间的数字和a和f之间的字母,并且必须以0 x开始:

/* examples of valid hexidecimal integer constants */
0xff
0xfF
0x1A
0xAB

整数始终存储在二进制中,无论我们在代码中用来表达它们的符号。这些符号不过是编写数字的另一种方式。

可以将整数类型变量声明为两种形式之一。 签名 unsigned 。默认情况下,用int关键字声明的变量为签名整数类型变量。这意味着这样的变量可以存储负整数常数或正整数。

让我们创建一个程序,将随机数分配给变量。随机分配的数字可能为负或阳性。每次我们运行它时,该程序都可以存储一个不同的值:


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/**
 * main - Entry point of the program 
 * Description: Program will assign a random number to a variable and print it 
 * whether the number stored in the variable is positive or negative followed by
 * a new line.
 * 
 * Return: 0 if program successfully executes
 */

int main(void)
{
    /* variable declaration */
    int n;

    /* assign random number to variable n */
    srand(time(0));
    n = rand() - RAND_MAX / 2;

    /* check if number assigned to the variable n is positive or negative */
    if (n < 0)
    {
        printf("%d is negative\n", n);
    } else if (n == 0)
    {
        printf("%d is zero\n", n);
    } else
    {
        printf("%d is positive\n", n);
    }

     /* exit program after successful execution */
    return (0);
}

上述代码段的焦点是向您显示用int关键字声明的变量n签名整数类型变量。您不必了解randsrandRAND_MAX做什么。

My Ubuntu 20.04 LTS terminal showing output generated by the above program when it is ran 5 times

从输出中,您可以看到每次执行程序(编译源代码的输出文件)时,它会打印一个不同的随机值(正值或负数)。随机值打印首先存储在变量n中。然后在if/elif/else条件块中使用n来确定应执行哪个printf语句。

要声明 unsigned 整数类型变量,我们使用unsigned int关键字。 无符号整数类型变量只能存储正整数常数。 (您可以通过更改可变n的声明中的类型关键字从intunsigned int。然后重新编译程序并运行它)。

对于签名无符号整数类型,C提供了3个亚型,使我们能够构建满足我们需求的整数类型变量。以下关键字用于指定每个子类型:

  • short int
  • unsigned short int
  • int
  • unsigned int
  • long int
  • unsigned long int

c允许我们通过删除int词在代码中缩写这些整数子类型的关键字。例如,可以将unsigned short int缩写为unsigned short,而long int可以缩短为long。以这种方式省略int是C程序员的广泛实践。

您在变量的声明中指定的整数类型确定可以通过变量存储的内存分配和值范围。每种整数类型表示的值范围及其内存分配因机器而异。下表显示了每种整数类型的内存分配以及它们在大多数64位Linux机器上表示的值范围:

类型 内存分配 值范围
short 2个字节 -32,768至32,767
unsigned short 2个字节 0至65,535
int 4个字节 -2,147,483,648至2,147,483,647
unsigned int 4个字节 0至4,294,967,295
long 8字节 -9,233,372,036,854,775,808至9,223,372,036,854,775,807
unsigned long 8字节 0至18,446,744,073,709,551,615

如何在整数类型变量中打印值

下表显示了每个整数子类型及其printf格式说明符:

类型 printf格式指定符(十进制,八分,十六进制)
short Cold65,Cold66,Cold67
unsigned short %hu%hu%hx
int %d%o%x75
unsigned int %u%o%x75
long %ld%lo%lx
unsigned long %lu%lo%lx

确定计算机实现中整数类型的值范围的一种方法是检查标准库的一部分limits.h标头。 limits.h标头定义了代表每种整数类型的最小和最大值的宏(表示语句或表达式的标识符)。

让我们创建一个程序,该程序分配给变量,为limits.h标头中每个整数类型定义的宏。然后使用格式说明符为其类型打印出存储在每个变量中的值:

#include <stdio.h>
#include <limits.h>
/**
 * main - Entry point of the program 
 * Description: Program will print the range values for each integer type
 * 
 * Return: 0 if program successfully executes
 */
int main(void)
{
    /* variable declaration */
    int integerVarMin;
    int integerVarMax;
    unsigned int uIntegerVarMax;
    short sIntegerVarMin;
    short sIntegerVarMax;
    unsigned short u_sIntegerVarMax;
    long LIntegerVarMin;
    long LIntegerVarMax;
    unsigned long u_LIntegerVarMax;


    /* Assign to each variable the macros defined 
     * for their integer type in the limits.h header 
     */ 
    integerVarMin = INT_MIN;
    integerVarMax = INT_MAX;
    uIntegerVarMax = UINT_MAX;
    sIntegerVarMin = SHRT_MIN;
    sIntegerVarMax = SHRT_MAX;
    u_sIntegerVarMax = USHRT_MAX;
    LIntegerVarMin = LONG_MIN;
    LIntegerVarMax = LONG_MAX;
    u_LIntegerVarMax = ULONG_MAX;

    /* Use printf and format specifiers to print values stored in each variable */
    printf("The min value that can be stored in an INT variable is: %d\n", integerVarMin);
    printf("The max value that can be stored in an INT variable is: %d\n", integerVarMax);
    printf("The max value that can be stored in an UNSIGNED INT variable is: %u\n", uIntegerVarMax);
    printf("The min value that can be stored in a SHORT INT variable is: %hd\n", sIntegerVarMin);
    printf("The max value that can be stored in a SHORT INT variable is: %hd\n", sIntegerVarMax);
    printf("The max value that can be stored in an UNSIGNED SHORT INT variable is: %hu\n", u_sIntegerVarMax);
    printf("The min value that can be stored in an LONG INT variable is: %ld\n", LIntegerVarMin);
    printf("The max value that can be stored in an LONG INT variable is: %ld\n", LIntegerVarMax);
    printf("The max value that can be stored in an UNSIGNED LONG INT variable is: %lu\n", u_LIntegerVarMax);

    /* exit program after successful execution */
    return (0);
}

My Ubuntu 20.04 LTS terminal showing the output of the above program

签名与未签名的整数类型

在c编程中,由于unsigned integers are more efficient,无符号整数类型变量优于签名整数类型变量。此外,未签名的整数为modulo-arithmetic overflow产生定义的结果。

角色类型

字符类型变量将存储字符常数。 char是用于指定字符类型的关键字。

在C编程中,单个引用''中的一个字符形成一个字符常数。

'v'

字符常数是字符集表示的字符。字符集是一种编码方案,用于用计算机理解的数字代码表示文本字符。

美国信息互换的标准代码(ASCII)是流行的角色集,用作计算机和通信系统中字符编码的标准。它使用整数常数编码文本字符。 ASCII 是大多数Linux/Unix样机上的基础字符。

以下字符在 ascii 中表示:

  • 大写和字母的小写字母的字符常数。
  • 数字的字符常数0到9
  • c特殊字符的字符常数。

ascii 能够表示128个不同的字符:

/* examples of characters represented in ASCII */
'b' /* lowercase letter b */
'\n' /* C special character */
'0' /* digit 0 */
' '; /* space */
'B' /* uppercase letter B */

重要的是要注意,在c编程中,字符常数是单个引号中包含的单个字符,而不是双引号:'b'"b"

不同

c也将其特殊字符视为单个字符,这就是为什么'\n'(用于通知printf打印新线路的特殊字符)的原因。

如何在字符类型变量中打印值

%c是用于打印char类型变量中存储的任何字符常数的printf格式。

让我们创建一个程序,将字符常数分配给字符类型变量,并打印存储在字符类型变量中的值:

#include <stdio.h>
/**
* main - Entry point of the program 
* Description: Program will print the value stored in a charater type variable
*
* Return: 0 if program successfully executes
*/
int main(void)
{
    /* variable declaration */
    char ch;

    /* variable initialization */
    ch = 'W';

    /* print the value stored in variable ch */
    printf("The character constant stored in variable ch is: %c\n", ch);

    /* exit program after successful execution */
    return (0);
}

My Ubuntu 20.04 LTS terminal showing the output of the above program

打印字符常数的另一种方法是使用putchar函数而不是printfputchar是一个标准库函数,可以将单个字符变常量作为参数并打印。

让我们创建一个程序,该程序使用putchar在小写中打印所有字母的所有字母,然后是新行:

#include <stdio.h>
/**
* main - Entry point of the program 
* Description: Program will print the letters of the alphabet in lowercase, 
* followed by a new line.
*
* Return: 0 if program successfully executes
*/
int main(void)
{
    /* declare variable */
    char i;

    /* initialize variable */
    i = 'a';

    /* loop and print the value stored in the variable then increment it */
    while (i <= 'z')
    {
        putchar(i);
        i++;
    }
    /* print a new line */
    putchar('\n');

    /* exit program after successful execution */
    return (0);
}

My Ubuntu 20.04 LTS terminal showing the output of the above program

putchar也可以作为参数,代表字符常数的整数值 ascii ,然后打印字符常数。

让我们创建一个程序,使用putchar从0开始打印基本10的所有单位数字,然后是新行:

#include <stdio.h>
/**
* main - Entry point of the program
* Description: Program will prints all single digit numbers of base
* 10 starting from 0 and then a new line.
* 
* Return: 0 if program successfully executes
*/
int main(void)
{
    /* declare variable */
    int i;

    /* initialize variable */
    i = 48;

    /* loop and print the value stored in the variable then increment it */
    while (i <= 57)
    {
        putchar (i);
        i++;
    }

    /* print a new line */
    putchar('\n');

     /* exit program after successful execution */
    return (0);
}

My Ubuntu 20.04 LTS terminal showing the output of the above program

角色常数与整数类型之间的相似之处

c将字符常数视为小整数,这意味着可以在算术计算中使用字符常数。当字符常数出现在算术计算中时,C简单地使用代表在执行程序的机器上的基础字符集(很可能是 ascii )中的字符常数的整数值。这打开了将表示为字符串表示为整数的数字的可能性,反之亦然。

让我们创建一个程序,使用字符常数进行简单的算术计算,并打印计算的结果:

#include <stdio.h>
/**
 * main - Entry point of the program
 *
 */
int main(void)
{
    char ch;
    int num;

    /* Convert an integer to its character constant equivalent */
    ch = 9 + '0' 
    /* Convert a character constant to its integer equivalent */
    num = '3' - '0';

    /* print the values
 stored in the variables */
    printf("The value stored in variable 'ch': %c\n", ch);
    printf("The value stored in variable 'num': %d\n", num);

    /* exit program after successful execution */
    return (0);
}

My Ubuntu 20.04 LTS terminal showing the output of the above program

在上面的代码段中,执行了num = '3' - '0';中的减法,以将数字 3 的字符常数表示为其小数整数常数表示。在ASCII编码中,字符常数'0''9'由连续整数值表示。字符常数'0'具有 48 的ASCII值,'1'的值为 49 '2'的值为 50 ,等等。从'3'(51)的ASCII值中减去'0'(48)的ASCII值给我们 51-48 = 3 ,这是数字的十进制整数代表 3 。

ch = 9 + '0'行中,相同的原理适用,但相反。在这里,执行添加以将数字 9 的小数整数常数表示为其相应的字符常数表示。将'0'(48)的ASCII整数值添加到整数9中,我们 48 + 9 = 57 ,即Digit的ASCII编码 9 。。

char类型变量与任何int类型变量之间的差异是它们各自的存储分配规范和值范围。 char类型变量使用较小的存储分配并接受较小的值范围。

同样,由于C允许字符常数用作算术计算中的整数,因此在签名和无符号的形式中可以存在char类型变量。

下表显示了char类型变量的不同形式的存储分配规范和值范围:

类型 内存分配规格 值范围
signed char 1个字节 -128至127
unsigned char 1个字节 0至255

C标准并未定义变量声明中的char是否仅表示签名类型或无符号类型。一些编译器将普通的char视为签名类型,而另一些则将其视为无签名类型...大多数情况下,无论是签署还是未签名,都没关系。

不要假设char默认为签名或未签名。如果重要的话,请在变量声明中使用signed char关键字或unsigned char关键字,而不是仅char

浮动类型

浮动类型变量将存储浮点常数。 float是用于指定浮动类型的关键字。

浮点常数是在小数点之后具有数字的值。您可以在小数点之前或之后省略数字,但您不能同时省略。浮点常数也可以用科学符号表示。

/* Example of valid floating point constants */
3.
120.8
-.0001
1.7e4 /* scientific notation 1.7 x 10^-4 */

C提供三(3)个浮动类型的关键字,对应于不同的浮点格式:

  • float单精度浮点格式
  • double用于双精度浮点格式
  • long double用于扩展浮点格式

C标准不说明floatdoublelong double类型提供多少精度,因为不同的计算机可能以不同的方式存储浮点数。大多数现代计算机都遵循IEEE标准754(也称为IEC 60559)中的规范。

默认情况下,所有浮点数常数均由C编译器存储为双精度值。例如,这意味着当C编译器在您的程序中找到12.34的浮点数常数时,它安排了数字以与通过double变量存储的值相同格式存储在内存中。

如果您希望将浮点常数存储在内存中,则作为float将f添加到常数末端时,将其分配给float type变量:

12.34f

如何在浮动类型变量中打印值

%f%e%g是用于用printf打印浮点数常数的格式。格式指定器%g产生了最令人愉悦的输出,因为它使printf决定是否以正常的浮点符号或科学符号为正常的浮点数。将值打印在long double类型变量中,添加L(EX:%Lf)到任何上述格式指定器中。

让我们创建一个程序,将值存储在浮动类型变量中,然后打印值:

/**
 * file name: float_type.c
 * main - Entry point of the program. 
 */
#include <stdio.h>

int main(void)
{
    /* variable declarations */
    float fVar;
    double dVar;
    long double LdVar;

    /* variable assignment */
    fVar = 12.34f;
    dVar = 12.34;
    LdVar = 12.341;

    /* print the values stored in the repective variables */
    printf("This is the value stored in a Float type variable: %g\n", fVar);
    printf("This is the value stored in a double type variable: %g\n", dVar);
    printf("This is the value stored in a long double type variable: %Lg\n", LdVar); 

    return (0);
}

My Ubuntu 20.04 LTS terminal showing the output of the above program

结论

变量和常数是程序中操纵的基本数据对象。声明列出了要使用的变量并说明它们具有什么类型。没有变量,很难完成您的程序。

在本文中,您已经介绍了如何声明适合您程序中特定需求的变量的基本原理,如何使用C标准库函数和格式指定器的不同类型的变量中存储在不同类型的变量中的值。

感谢您抽出宝贵的时间阅读我的文章。请单击“反应图标”并将文章分享到您的社交网络,本文中的信息可能会帮助您的网络中的某人。

参考

C Library - | Tutorialspoint

The C Book — Keywords and identifiers (gbdirect.co.uk)

C Identifiers | Microsoft Learn

The C Book — Integral types (gbdirect.co.uk)