所有C程序,无论其大小如何,都包含功能和变量。一个函数包含指定要完成的计算操作的语句,并且变量存储了计算过程中使用的值。
在本文中,您将学习C编程中变量的含义,如何声明变量并为其分配值。您将了解不同类型的变量及其可以存储的值范围。您将了解ASCII角色集。您将学习如何使用C标准库函数printf
和putchar
打印存储在不同类型的变量中的值。
表中的内容
- Prerequisites
- What is a variable in C
- What is an Identifier
- What is a Type
- How to declare a Variable in C
- What happens in your computer when you declare a Variable in C
- Importance of specifying a Type in a variable declaration
- Conclusion
先决条件
要享受本文的完整体验,您应该有以下内容:
- 对如何使用
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中不同。因此,sum
,Sum
和SUM
是不同的标识符。
编程最佳实践建议您构建反映其预期用途的标识符。
什么是类型
一种类型是一种规范,描述了标识符可以存储或操纵的值的种类。
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);
}
我们使用带有printf
函数的格式说明符来打印存储在变量中的值。在上面的代码段中,格式指定器%lu
在printf
函数中用于打印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
是签名整数类型变量。您不必了解rand
,srand
和RAND_MAX
做什么。
从输出中,您可以看到每次执行程序(编译源代码的输出文件)时,它会打印一个不同的随机值(正值或负数)。随机值打印首先存储在变量n
中。然后在if/elif/else
条件块中使用n
来确定应执行哪个printf
语句。
要声明 unsigned 整数类型变量,我们使用unsigned int
关键字。 无符号整数类型变量只能存储正整数常数。 (您可以通过更改可变n
的声明中的类型关键字从int
到unsigned 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 ,%x 75
|
unsigned int |
%u ,%o ,%x 75
|
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);
}
签名与未签名的整数类型
在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);
}
打印字符常数的另一种方法是使用putchar
函数而不是printf
。 putchar
是一个标准库函数,可以将单个字符变常量作为参数并打印。
让我们创建一个程序,该程序使用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);
}
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);
}
角色常数与整数类型之间的相似之处
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);
}
在上面的代码段中,执行了 在 同样,由于C允许字符常数用作算术计算中的整数,因此在签名和无符号的形式中可以存在 下表显示了 C标准并未定义变量声明中的 不要假设 浮动类型变量将存储浮点常数。 浮点常数是在小数点之后具有数字的值。您可以在小数点之前或之后省略数字,但您不能同时省略。浮点常数也可以用科学符号表示。 C提供三(3)个浮动类型的关键字,对应于不同的浮点格式: C标准不说明 默认情况下,所有浮点数常数均由C编译器存储为双精度值。例如,这意味着当C编译器在您的程序中找到12.34的浮点数常数时,它安排了数字以与通过 如果您希望将浮点常数存储在内存中,则作为 让我们创建一个程序,将值存储在浮动类型变量中,然后打印值: 变量和常数是程序中操纵的基本数据对象。声明列出了要使用的变量并说明它们具有什么类型。没有变量,很难完成您的程序。 在本文中,您已经介绍了如何声明适合您程序中特定需求的变量的基本原理,如何使用C标准库函数和格式指定器的不同类型的变量中存储在不同类型的变量中的值。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
类型变量使用较小的存储分配并接受较小的值范围。char
类型变量。char
类型变量的不同形式的存储分配规范和值范围:
类型
内存分配规格
值范围
signed char
1个字节
-128至127
unsigned char
1个字节
0至255
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 */
float
单精度浮点格式double
用于双精度浮点格式long double
用于扩展浮点格式float
,double
和long double
类型提供多少精度,因为不同的计算机可能以不同的方式存储浮点数。大多数现代计算机都遵循IEEE标准754(也称为IEC 60559)中的规范。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);
}
结论
感谢您抽出宝贵的时间阅读我的文章。请单击“反应图标”并将文章分享到您的社交网络,本文中的信息可能会帮助您的网络中的某人。
参考
The C Book — Keywords and identifiers (gbdirect.co.uk)