C语言数据的类型

一、数据类型的种类 

概述:在C语言中,每个变量在使用前必须先进行类型声明,即在前面说明其类型,这是因为C语言的语法规定了每个变量必须要有明确定义的数据类型。这数据类型的声明指定了变量可以存储的数据种类,确保了编译器正确地分配内存空间和进行相应的操作,使程序在运行时能够有效地处理数据。因为C语言是静态类型语言。

C语言中有多种数据类型,这些数据类型大体可以分为基本数据类型和派生(复合)数据类型。

  1. 基本数据类型:

    • 整型: 用于表示整数,包括intshortlong等类型。
    • 浮点型: 用于表示带有小数部分的数字,包括floatdouble类型。
    • 字符型: 用于表示单个字符,包括char类型。
    • 布尔型: 用于表示真(true)或假(false),C语言标准中没有直接定义布尔类型,通常使用int来表示,0表示假,非零表示真。在CPP中可用bool表示。
  2. 派生数据类型:

    • 数组: 用于存储相同类型的多个元素。
    • 结构体: 用于组合不同类型的数据元素。
    • 共用体: 允许在相同的内存位置存储不同的数据类型,但只能同时存储其中一个成员的值。
    • 枚举: 用于定义一组命名的整数常量。
  3. 指针类型:

    • 指针: 存储变量的内存地址,允许直接访问该地址上的数据。
    • 空指针: 用于存储任意类型的指针,通常表示未知类型。
  4. 其他类型:

    • 函数类型: 表示函数的返回类型和参数类型
    • typedef定义的类型: 允许为已有类型定义新的名称,提高代码的可读性和灵活性。

C语言数据的类型_第1张图片

 内存是以字节为单位 一个字节由8位二进制数组成。在C语言中,不同类型的变量在内存中占据的空间大小在不同操作位数的系统中是不同的。

如下在64位操作系统变量的大小

变量名 大小/字节
char 1
short 2
int 4
long 8
float 4
duoble 8
short 2
int*(指针) 8
void 1

注意:在32位操作系统中 long 为4字节,int * 为4字节其余与64位操作系统一样。


二、类型转换

概述:类型转换是把变量从一种类型转换为另一种数据类型。

1. 隐式类型转换

  • 也称为自动类型转换。
  • 在表达式中,编译器会自动进行的类型转换,以保证表达式的结果的类型正确。

例1 

#include 
 
int main()
{
   int a = 5;
   float b = 2.5;

   float result = a + b;  // 隐式类型转换,a会被转换为float类型
   printf("Value of result: %.2lf\n", result);
   return 0;
}

结果 

Value of sum : 7.50

例2 

#include 
 
int main()
{
   int  i = 17;
   char c = 'c';  // c 的ascii 值是 99
   int sum;
 
   sum = i + c;
   printf("Value of sum : %d\n", sum );
   return 0;
}

结果 

Value of sum : 116

注意:编译器编译时如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算。

2. 显示类型转换

  • 也称为强制类型转换。
  • 在代码中,程序员显式地使用强制类型转换运算符来改变表达式或变量的数据类型。
  • 使用强制类型转换时,要注意可能造成数据精度的损失或溢出。

语法:在要转换的变量类型前加括号在里面写转换后的类型如 (int)即转换为int型。

例1

#include 
 
int main()
{
   int sum = 17, count = 5;
   double mean;
 
   mean = (double) sum / count;		// sum 强转为double
   printf("Value of mean : %f\n", mean );
 
   return 0;
}

结果

Value of mean : 3.400000
  1. 强制类型转换运算符的优先级大于除法。

  2. 因此 sum 的值首先被转换为 double 型,然后除以 count,得到一个类型为 double 的值。

  3. count 会被隐式转换为 double


三、C 中的左值和右值

C 中有两种类型的表达式:

  1. 左值(lvalue):指向内存位置的表达式被称为左值表达式。左值可以出现在赋值号的左边或右边。

  2. 右值(rvalue):术语右值指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。

1. 左值

  • 左值是指可被标识并位于赋值号左边的表达式或变量。它代表一个可以被修改的位置。
  • 左值通常是具有内存地址的表达式,例如变量或数组元素。在C语言中,左值表示可以放置一个值的位置。
int x = 10;  // 'x' 是一个左值
  • 在赋值操作中,左值用于标识存储数据的位置,例如 x = 10;,其中 x

2. 右值

  • 右值是指不能被标识并位于赋值号右边的表达式,它通常是一个计算结果的临时值。
  • 右值是一个可以提供值但不能接受值的表达式,通常是一些常量、计算结果或者临时的中间值。
int y = 5;   // '5' 是一个右值
int z = x + y;  // 'x + y' 是一个右值
  • 在赋值操作中,右值用于提供要存储的数据值,例如 x = 10;,其中 10 是右值。

总结:通常来说,左值表示一个存储位置而右值表示一个值。在表达式中,左值和右值的使用会受到语法和语义的限制。在C语言中右值是不能被赋值的。

四、常量

在 C 中,有两种简单的定义常量的方式:

  1. 使用 #define 预处理器: #define 可以在程序中定义一个常量,它在编译时会被替换为其对应的值。

  2. 使用 const 关键字:const 关键字用于声明一个只读变量,即该变量的值不能在程序运行时修改。

  3. 请注意,把常量定义为大写字母形式,是一个很好的编程习惯。

#define 与 const 的使用

1. #define 的使用

#define 是一种预处理指令,用于在编译之前进行文本替换。

#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))

define 注意“边缘效应” 例:

#define N 2+3
int a;
a = N / 2; // a运行后打印的结果为?

 在编译时预想 a=2.5,实际打印结果是 3.5 原因是在预处理阶段,编译器将 a=N/2 处理成 a=2+3/2,这就是 define的文本替换 宏的边缘效应,所以应该写成 #define N (2+3) ,更严谨。

2. const 的使用

const 是C语言中的关键字,用于声明常量并赋予其类型。

const double PI = 3.14159;
const int MAX_SIZE = 100;

#define 与 const 区别

概述:#define 与 const 这两种方式都可以用来定义常量。通常情况下,使用 const 关键字来定义常量,因为它具有类型检查和作用域的优势,而 #define 仅进行简单的文本替换,可能会导致一些意外的问题。

#define 和 const 关键字在定义常量时的一些区别:

  1. 替换机制:#define 是进行简单的文本替换const 是声明一个具有类型的常量#define 定义的常量在编译时会被直接替换为其对应的值,而 const 定义的常量在程序运行时会分配内存,并且具有类型信息。

  2. 类型检查:#define 不进行类型检查,因为它只是进行简单的文本替换。而 const 定义的常量具有类型信息,编译器可以对其进行类型检查。这可以帮助捕获一些潜在的类型错误。

  3. 作用域:#define 定义的常量没有作用域限制,它在定义之后的整个代码中都有效。而 const 定义的常量具有块级作用域,只在其定义所在的作用域内有效。

  4. 调试和符号表:使用 #define 定义的常量在符号表中不会有相应的条目,因为它只是进行文本替换。而使用 const 定义的常量会在符号表中有相应的条目,有助于调试和可读性。


下一篇:C语言存储类型及运算符

你可能感兴趣的:(C语言随笔,c语言,开发语言)