C语言-数据类型、常量与变量-学习笔记02

本文详细介绍了C语言中的数据类型,包括bool、char、short、long、long long、int和enum等基本数据类型,以及它们的取值范围。此外,还讲解了整型常量、浮点常量、字符常量、字符串常量和标识常量等常量的概念。在变量部分,阐述了变量的基础知识和四种存储类型:auto、register、static和extern。
摘要由CSDN通过智能技术生成

一. 数据类型分类

在这里插入图片描述

二. 基本数据类型

  • 我们可以通过sizeof来确定字节长度
#include <stdio.h>

int main(int argc, char *argv[])
{
	printf("%lu %lu %lu %lu\n", sizeof(_Bool), sizeof(char), sizeof(short), sizeof(int));
	return 0;
}

返回1 1 2 4

  • 判断数字是否越界可以看limits.h这个头文件,可以在这个文件里看到每个数据类型的最大与最小取值
vi /usr/include/limits.h 

1. 布尔型 bool

其中对于布尔型需要引入头文件<stdbool.h>,如果不想引用头文件可以用_Bool作为基本类型,但缺点是truefalse没有被定义。这被定义在头文件<stdbool.h>内。

#include <stdio.h>
#include <stdbool.h>

int main(int argc, char *argv[])
{
	bool a, b, c;
	a = true; // true
	b = false // false
	c = -1; // true
}

2. 字符型 char

  • char的取值范围及其编码
类型名称长度(字节)值域
char1-128 ~ 127 或 0 ~ 255
signed char1-128 ~ 127
unsigned char10 ~ 255

signed char来说最高位位符号位0表示正,1表示负,对正数来说可以表述 2 7 − 1 2^7-1 271个数。
对负数来说先复习以下补码。计算机中负数用补码表示

数字原码反码补码
-1100000011111111011111111
-12711111111100000001000001
-1281000000
  • char是字符型但同时也能表示整数
#include <stdio.h>

int main(int argc, char *argv[])
{
	char ch = 65;
	printf("ch=%d %c\n", ch, ch);
	return 0;
}

返回

ch=65 A
  • 如果让ch=128超出了最大值127,其编码会是10000000也就是上表中的-128,因此会返回ch=-128
  • 如果用unsigned,也就是unsigned char ch=-1超出了最小值0,其编码会是11111111也就是上表中的最大值255,因此会返回ch=255

3. short,long,long long类型

类型名称长度(字节)值域
short (signed short)2-32768~32767
unsigned short20~65535
long4
long long8

4. int类型

类型名称长度(字节)值域
int (signed int)4-2147483648~2147483647
unsigned int40~4294967295
#include <stdio.h>

int main(){
	int a = 0x12345678;
	printf("%d %x %o\n", a, a, a) //打印十进制,十六进制,八进制
}

5. enum类型

  • 枚举的定义方法:
//1. 定义枚举类型的时候定义枚举变量
enum 枚举类型 {item1(=1), item2, ...} 枚举变量;

//2. 先定定义枚举类型,在定义枚举变量
enum 枚举类型
{
	item1, item2, ...
};
enum 枚举类型 枚举变量;

//3. 省略枚举类型,直接定义枚举变量
enum {item1, item2, ...} 枚举变量;
  • 举例,在这里给MON赋值1TUE会自动被赋值2,以此类推。如果不赋值1,会被默认赋值0
#include <stdio.h>
 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
 
int main()
{
    enum DAY day;
    day = WED;
    printf("%d",day); //3
    return 0;
}
  • 遍历:在所有值都连续的情况下可以遍历
#include <stdio.h>
 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
int main()
{
    // 遍历枚举元素
    for (day = MON; day <= SUN; day++) {
        printf("枚举元素:%d \n", day);
    }
}

举一个不连续情况下的enum定义

enum DAY {MON, TUE=3, WED, THU, FRI, SAT, SUN}; //每个元素得到的值是 MON=1, TUE=3, WED=4, THU=5...

三. 基本数据类型的常量

常量指在程序运行期间其数值不发生变化的数据

1. 整型常量

整数可以是十进制数、八进制数和十六进制数

  • 八进制数:01234(八进制一个数代表3个二进制位)
  • 十六进制数:0xd1c(十六进制一个数代表4个二进制位)

2. 浮点常量

  • 浮点常量又称为实数,一般含有小数部分
  • 在C语言中,实数只有十进制的实数,分为单精度与双精度。
  • 实数的表现方法有两种,即一般形式和指数形式
    • 一般形式:1.1,1.2
    • 指数形式:1.176e+10

可以结合Java-常亮与变量-学习笔记02来学习

3. 字符常量

通常指单一字符,用单引号括起来。
一些规律

char a, b, c, d, e;
int x;
a = 'F'; //将70给a
b = 'A'+2 // C
c = ' ' + 'B' // b
d = 'b' - 32 // B
e = '0';
x = e-48 // 整数 0

4. 字符串常量

  • 用双引号括起来。char *p = "string";
  • 字符串是以'\0'结尾的
    需要注意的是‘9'不等于'9'因为"9"隐含'\0'
char arr1[] = {"abc"};
char arr2[] = {'a', 'b', 'c', '\0'}; // arr1 == arr2

5. 标识常量

#define <表示常量名称> <常量>
#define PI 3.1415

通过下面的程序可以发现宏与正常的计算不同,宏是原样替代,而不是计算!

#include <stdio.h>
# define ONE 1
# define TWO ONE + ONE

int main(int argc, char *argv[])
{
	int a = 10, b = 20, c;
	c = ONE + TWO * b + a; //计算结果是1+1+1*20+10=32 而不是 1+2*20+10=51
} 

在终端输入

gcc -E define.c -o define.i

打开define.i,文件最后显示如下,可以看到c = 1 + 1 + 1 * b + a;

# 5 "deine.c"
int main(int argc, char *argv[])
{
  int a = 10, b = 20, c;
  c = 1 + 1 + 1 * b + a;
}

如果想算出 1 + 2 ∗ 20 + 10 = 51 1+2*20+10=51 1+220+10=51这个结果需要做一些更改

#include <stdio.h>
# define ONE 1
# define TWO (ONE + ONE) //需要加括号

int main(int argc, char *argv[])
{
	int a = 10, b = 20, c;
	c = ONE + TWO * b + a; 
} 

四. 变量

1. 变量的基础

  • 由字母、数字、下划线组成,不能以数字开头,不能和关键字重名
  • 变量占据存储空间的大小由其数据类型决定
  • 变量在内存空间中的首地址为变量的地址

2. 变量的声明与储存类型(auto, register, static, extern)

  • 变量说明的一般形式是:<存储类型> <数据类型> <变量名>
  • 一般<存储类型>默认缺省,存储类型有四种
    • auto:声明的是局部变量最常用(默认随机值)auto int i;int i;一样
    • register:寄存器型,申请将变量放入CPU的寄存器中,以加快程序运行速度,若申请不到同auto
      • 必须是cpu能够接收的类型,比如说32位的计算机,大于32位的数据就存不了
      • 不能用&取地址
    • static:静态存储类型,可以是全局也可以是局部变量(全局变量默认为0)
      • 在内存中以固定的地址存放,而不是以堆栈形式存放的
      • 只要程序没有结束就不会随着程序段的结束而消失,下次调用还会保留上次调用结果
        int i=1;
        while (i<5){
        	static int a; //默认为0
        	a++
        	printf("a=%d\n", a);
        	i++
        }
      
      return
      a = 1
      a = 2
      a = 3
      a = 4
      
    • extern:当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可以引用这个变量
      定义两个文件extern_static1.cextern_static2.c
      第一个文件:extern_static1.c
      int global_a = 100;
      
      第二个文件exterm_static2.c
      #include <stdio.h>
      extern in global_a; //这里需要申明 
      int main(int argc, char *argv[])
      {
      	printf("global_a"=%d\n", global_a);
      	return 0;
      }
      
      编译的时候需要将两个文件都放在一起用
      gcc extern_static1.c extern_static2.c
      
      如果我们把extern_static1.c修改一下,在变量声明前加了static后再从外部调用就会报错
      static int global_a = 100;
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值