2天学完C语言-------1.2 C语言数据类型

本文详细介绍了C语言中的数据类型,包括基本数据类型(整数、浮点、字符、布尔)、复合数据类型(数组、结构体、联合体)以及运算符和表达式的概念,强调了优先级和结合性的理解。
摘要由CSDN通过智能技术生成
  • C语言提供了多种数据类型,包括基本数据类型和复合数据类型。
  • 基本数据类型包括整数类型、浮点数类型、字符类型和布尔类型。
  • 复合数据类型包括数组、结构体和联合体。

C语言提供了多种数据类型,包括以下几类:

1. 基本数据类型(Primary Types)

整数类型(Integer Types):用于表示整数值,例如int、short、long等。

- 包括有符号整数类型(如int、short、long)和无符号整数类型(如unsigned int、unsigned short、unsigned long)。不同的整数类型有不同的取值范围。

浮点数类型(Floating-Point Types):用于表示带小数部分的数值,例如float、double等。包括单精度浮点数类型(float)和双精度浮点数类型(double)。浮点数类型用于表示带小数部分的数值。

字符类型(Character Type):用于表示单个字符,例如char。

- 用于存储单个字符的数据类型。

- 可以使用字符常量和转义序列来表示特殊字符。

布尔类型(Boolean Type):用于表示真值,以整数形式表示真(非零)和假(零)。

 布尔类型用于表示真值,有两个值:真(true)和假(false)。

- 在C语言中,使用整数类型int来表示布尔类型,取值0表示假,非0表示真。

2. 复合数据类型(Derived Types)

数组类型(Array Types):将相同类型的数据元素组合在一起,形成有序的数据集合。

结构体类型(Structure Types):将不同类型的数据成员组合在一起,形成自定义的数据类型。

联合体类型(Union Types):同一内存空间可以容纳不同类型的数据。

 #include <stdio.h>
// 定义联合体类型
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data; // 访问联合体成员
data.i = 10;
printf("data.i: %d\n", data.i);
data.f = 3.14;
printf("data.f: %.2f\n", data.f);
strcpy(data.str, "Hello");
// 联合体内存占用的是最大成员的大小
printf("data.str: %s\n", data.str); 
printf("Memory occupied by data: %ld bytes\n", sizeof(data));
return 0;
}

在上面的示例中,我们首先定义了一个名为Data的联合体类型,它包含了int型的成员i、float型的成员f和字符数组型的成员str。在主函数中,我们声明了一个data变量,并分别访问了联合体的不同成员。我们给联合体的成员赋值,并使用printf函数打印出相应的值。需要注意的是,联合体的内存占用是最大成员的大小,因为联合体中的成员共享同一块内存。

输出结果:

data.i: 10
data.f: 3.14
data.str: Hello Memory occupied by data: 20 bytes

通过联合体,我们可以在同一块内存中存储不同类型的数据,只能使用其中一个成员来

访问该共享内存区域。这在某些情况下可以节省内存空间并方便数据的理。

3. 指针类型(Pointer Types)

指针类型用于存储地址值,指向其他数据类型。

4. 枚举类型(Enumeration Types)

枚举类型用于定义一组具名的整数常量。

5. void类型

void类型用于表示没有返回值或没有任何类型的指针。

在C语言中,可以使用这些数据类型来声明和定义变量,存储不同类型的数据,并进行相应的操作和计算。根据具体的需求和数据特点,选择合适的数据类型可以提高程序的性能和效率。

6.数据类型的选择

在选择数据类型时,需要根据数据的范围、精度和内存占用情况来进行考虑。特定的数据类型可以提供更高的精度或节省更多的内存空间。

通过了解变量和数据类型的基础知识,可以更好地理解如何声明和使用变量,以及如何选择适当的数据类型来存储不同类型的数据。

C语言中的数据类型具有不同的范围、精度和内存占用,这些特征决定了数据类型在程序中的使用方式和适用场景。下面是C语言中常见数据类型的范围、精度和内存占用情况的概述。

1. **整数类型**:

- `char`:通常占用1字节,表示字符或小整数。范围为-128到127或0到255,取决于是有符号还是无符号。

- `unsigned char`:通常占用1字节,表示无符号字符或小整数。范围为0到255。

- `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`:通常占用4字节或8字节,表示长整数。范围为(-2,147,483,648到2,147,483,647)或(-9,223,372,036,854,775,808到9,223,372,036,854,775,807)。

- `unsigned long`:通常占用4字节或8字节,表示无符号长整数。范围为0到(4,294,967,295或18,446,744,073,709,551,615)。

2. **浮点数类型**:

- `float`:通常占用4字节,表示单精度浮点数。有效位数为6-9位,范围为1.2E-38到3.4E+38(约)。

- `double`:通常占用8字节,表示双精度浮点数。有效位数为15-18位,范围为2.3E-308到1.7E+308(约)。

- `long double`:通常占用8字节或更多,表示扩展精度浮点数。有效位数和范围可能会因系统而异。

3. **其他数据类型**:

- `void`:用于指示无类型。不占用内存。

- `enum`:用于定义枚举类型,范围根据枚举常量的个数决定。

- `struct`:用于定义结构体类型,所占内存根据结构体成员的类型和数量决定。

- `union`:用于定义联合类型,所占内存根据联合成员中最大类型的大小决定。

以上是常见的C语言数据类型及其范围、精度和内存占用情况的一般规定。具体的实现可能因编译器、操作系统和硬件平台而有所不同。您可以根据具体的需求选择合适的数据类型来确保程序的正确性和性能。

2. 运算符和表达式

运算符和表达式是C语言中用于进行各种计算和操作的重要元素。运算符可以用于操作数据,而表达式则是由操作数和运算符组成的计算式。下面是关于运算符和表达式的一些重要知识点:

2.1 基本运算符

 - 算术运算符:用于执行基本的数学运算,如加法、减法、乘法、除法、取余等。

   - 关系运算符:用于比较操作数之间的关系,如相等、不相等、大于、小于等。

   - 逻辑运算符:用于处理布尔类型的操作数,有与、或、非等运算。

   - 赋值运算符:用于给变量赋值,如将一个数值或表达式赋给变量。

   - 位运算符:用于对二进制数据的位进行操作,如按位与、按位或、按位取反等。

   - 条件运算符:也称为三元运算符,形式为(condition) ? expression1 : expression2,用于根据条件选择不同的值。

2.2 表达式

   - 表达式由操作数和运算符组成,可以进行计算得出值。

   - 可以通过组合运算符和操作数创建复杂的表达式。

   - 表达式可以包含变量、常量、函数调用等。

2.3 优先级和结合性

   - 运算符有不同的优先级和结合性,决定了它们在表达式中的计算顺序。

   - 括号可以用来改变表达式的计算顺序。

   - 在复杂的表达式中,需要理解和遵循运算符的优先级和结合性规则,以得到正确的计算结果。下面是一些常见运算符的优先级和结合性规则的概述:

1. 优先级高于其他运算符的运算符:

- 圆括号 `()`:最高优先级,用于改变运算优先级或明确运算顺序。

- 方括号 `[]`:用于数组元素的访问。

- 点号 `.` 和箭头 `->`:用于结构体和联合体成员的访问。

2. 一元运算符:

- 递增 `++` 和递减 `--`:增加或减少操作数的值。

- 取址 `&` 和解引用 `*`:用于获取变量的地址和访问指针指向的值。

- 正号 `+` 和负号 `-`:改变操作数的符号。

一元运算符是只针对一个操作数进行操作的运算符。下面是一些常见的一元运算符以及它们的例子:

1. 递增和递减运算符:

- 递增运算符 `++`:将操作数的值增加1。例如:

     int a = 5;
     int b = ++a;  // 先将a的值增加1,然后将新的值赋给b
     // 此时,a的值为6,b的值也为6

- 递减运算符 `--`:将操作数的值减少1。例如:

     int a = 5;
     int b = --a;  // 先将a的值减少1,然后将新的值赋给b
     // 此时,a的值为4,b的值也为4
2. 正号和负号运算符:

- 正号运算符 `+`:保持操作数的值不变。例如:

     int a = 5;
     int b = +a;  // 将a的值赋给b,值仍为5

- 负号运算符 `-`:改变操作数的值的符号。例如:

     int a = 5;
     int b = -a;  // 将a的值取负赋给b,值为-5
3. 取址和解引用运算符:

- 取址运算符 `&`:获取操作数的地址。例如:

     int a = 5;
     int *ptr = &a;  // 将a的地址赋给指针ptr
     // 现在ptr指向a的地址,可以通过解引用ptr来访问a的值
     

- 解引用运算符 `*`:访问指针所指向的值。例如:

     int a = 5;
     int *ptr = &a; // 将a的地址赋给指针ptr
     int b = *ptr;  // 解引用ptr,获取a的值,并赋给b
     // 此时,b的值为5

左值(lvalue)和右值(rvalue)是与赋值操作相关的概念:

- 左值是可以被赋值的表达式,它具有一个内存位置。
- 右值是不能被赋值的表达式,它不具有一个内存位置。

例如:

int a = 5;  // a是左值,可以被赋值
int b = a;  // a是右值,不能被赋值,只能取值

需要注意的是,有些表达式可以同时作为左值和右值,例如数组元素的引用和指针的引用。

3. 算术运算符:

- 乘法 `*`、除法 `/` 和取模 `%`:乘法、除法和取余操作。

- 加法 `+` 和减法 `-`:加法和减法操作。

4. 移位运算符:

- 左移 `<<` 和右移 `>>`:按位左移和右移操作。

5. 关系运算符:

- 大于 `>`、小于 `<`、大于等于 `>=` 和小于等于 `<=`:比较操作数的大小关系。

- 等于 `==` 和不等于 `!=`:比较操作数的相等关系。

6. 逻辑运算符:

- 逻辑非 `!`:取反操作。

- 逻辑与 `&&`:逻辑与操作,两个操作数都为真时结果为真。

- 逻辑或 `||`:逻辑或操作,两个操作数只要有一个为真就为真。

7. 位运算符:

- 按位与 `&`、按位或 `|` 和按位异或 `^`:按位操作。

- 位取反 `~`:取反操作。

8. 赋值运算符:

- 赋值 `=`:将右边的值赋给左边的操作数。

- 复合赋值运算符(如`+=`、`-=`、`*=`等):将运算结果与变量进行运算和赋值。

运算符的结合性规则是指当多个相同优先级的运算符出现时,确定这些运算符的求值顺序。常见的结合性规则有:

- 左结合性(Left associative):从左到右进行结合运算。

- 右结合性(Right associative):从右到左进行结合运算。

例如,赋值运算符是右结合的,因此可以进行连续赋值:

int a, b, c;
a = b = c = 10;  // 从右到左依次赋值

了解运算符的优先级和结合性规则可以帮助我们编写清晰且正确的表达式,特别在复杂的表达式中,正确的使用括号可以明确运算优先级和结合性,避免产生不必要的错误。

2.4 增强赋值运算符

   C语言提供了一些特殊的赋值运算符,如+=、-=、*=等,用于将运算结果与原始值一起赋给变量。

通过了解运算符和表达式的基本概念,可以进行各种数据的计算和操作,编写更加灵活和高效的程序。要注意优先级和结合性规则,并选择适当的运算符和表达式来解决问题。

2.5 举例说明

2.5.1 算术运算符的例子

int a = 10;
int b = 5;
int sum = a + b;  // 加法运算
int diff = a - b;  // 减法运算
int product = a * b;  // 乘法运算
int quotient = a / b;  // 除法运算
int remainder = a % b;  // 取余运算

2.5.2 关系运算符的例子

int a = 10;
    int b = 5;
    int c = 10;
    if(a > b) {
        printf("a大于b\n");
    }
    if(a == c) {
        printf("a等于c\n");
    }
    if(a != b) {
        printf("a不等于b\n");
    }

2.5.3 赋值运算符的例子

int a = 10;
int b = 5;
a += b;  // 相当于 a = a + b;
printf("a的新值为:%d\n", a);
a *= 2;  // 相当于 a = a * 2;
printf("a的新值为:%d\n", a);

2.5.4 逻辑运算符的例子

int a = 10;
int b = 5;
int c = 15;
if(a > b && a < c) {
    printf("a大于b,且a小于c\n");
}
if(a > b || a > c) {
    printf("a大于b,或者a大于c\n");
}
if(!(a > b)) {
    printf("a不大于b\n");
}

2.5.5 条件运算符的例子

int a = 10;
int b = 5;
int max;
max = (a > b) ? a : b;  // 如果a大于b,则max等于a,否则等于b 
printf("两个数中的最大值为:%d\n", max);//结果为10 前真后假

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小白Erike.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值