概述:在C语言中,每个变量在使用前必须先进行类型声明,即在前面说明其类型,这是因为C语言的语法规定了每个变量必须要有明确定义的数据类型。这数据类型的声明指定了变量可以存储的数据种类,确保了编译器正确地分配内存空间和进行相应的操作,使程序在运行时能够有效地处理数据。因为C语言是静态类型语言。
C语言中有多种数据类型,这些数据类型大体可以分为基本数据类型和派生(复合)数据类型。
基本数据类型:
int
、short
、long
等类型。float
和double
类型。char
类型。int
来表示,0表示假,非零表示真。在CPP中可用bool表示。派生数据类型:
指针类型:
其他类型:
?内存是以字节为单位 一个字节由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位操作系统一样。
概述:类型转换是把变量从一种类型转换为另一种数据类型。
- 也称为自动类型转换。
- 在表达式中,编译器会自动进行的类型转换,以保证表达式的结果的类型正确。
#include <stdio.h>
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
#include <stdio.h>
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
注意:编译器编译时如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算。
- 也称为强制类型转换。
- 在代码中,程序员显式地使用强制类型转换运算符来改变表达式或变量的数据类型。
- 使用强制类型转换时,要注意可能造成数据精度的损失或溢出。
#include <stdio.h>
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
强制类型转换运算符的优先级大于除法。
因此 sum 的值首先被转换为 double 型,然后除以 count,得到一个类型为 double 的值。
count 会被隐式转换为 double 型
C 中有两种类型的表达式:
左值(lvalue):指向内存位置的表达式被称为左值表达式。左值可以出现在赋值号的左边或右边。
右值(rvalue):术语右值指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
int x = 10; // 'x' 是一个左值
x = 10;
,其中 x
int y = 5; // '5' 是一个右值
int z = x + y; // 'x + y' 是一个右值
x = 10;
,其中 10
是右值。总结:通常来说,左值表示一个存储位置,而右值表示一个值。在表达式中,左值和右值的使用会受到语法和语义的限制。在C语言中右值是不能被赋值的。
在 C 中,有两种简单的定义常量的方式:
使用 #define 预处理器: #define 可以在程序中定义一个常量,它在编译时会被替换为其对应的值。
使用 const 关键字:const 关键字用于声明一个只读变量,即该变量的值不能在程序运行时修改。
请注意,把常量定义为大写字母形式,是一个很好的编程习惯。
#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) ,更严谨。
const
是C语言中的关键字,用于声明常量并赋予其类型。
const double PI = 3.14159;
const int MAX_SIZE = 100;
概述:#define 与 const 这两种方式都可以用来定义常量。通常情况下,使用 const 关键字来定义常量,因为它具有类型检查和作用域的优势,而 #define 仅进行简单的文本替换,可能会导致一些意外的问题。
#define 和 const 关键字在定义常量时的一些区别:
替换机制:#define
是进行简单的文本替换,而 const
是声明一个具有类型的常量。#define
定义的常量在编译时会被直接替换为其对应的值,而 const
定义的常量在程序运行时会分配内存,并且具有类型信息。
类型检查:#define
不进行类型检查,因为它只是进行简单的文本替换。而 const
定义的常量具有类型信息,编译器可以对其进行类型检查。这可以帮助捕获一些潜在的类型错误。
作用域:#define
定义的常量没有作用域限制,它在定义之后的整个代码中都有效。而 const
定义的常量具有块级作用域,只在其定义所在的作用域内有效。
调试和符号表:使用 #define
定义的常量在符号表中不会有相应的条目,因为它只是进行文本替换。而使用 const
定义的常量会在符号表中有相应的条目,有助于调试和可读性。
下一篇:C语言存储类型及运算符