《重生到现代之从零开始的C语言生活》——C语言的数据类型和变量

C语言的数据类型和变量

数据类型

C语言中的数据类新用来描述数据,而类型可以理解为是数据的分类。

数据类型可以分为以下几个

  • 内置类型
    • 字符型
    • 整型
    • 浮点型
    • 布尔类型
  • 自定义类型
    • 数组
    • 结构体-struct
    • 枚举-enum
    • 联合体-union

在下面我们着重讲解内置类型

  1. 字符型

char 可以创建一个字符型的变量(变量会在下文进行描述,在这知道即可)

  1. 整形

短整型short int
整形int
长整型long int
更长的整形long long int

他们都可以创建一个整型的变量

  1. 浮点型

fioat
double
long double

他们都可以创建一个浮点型的变量

  1. 布尔类型

一个特殊的类型,专门表示真假,由 _Bool 表示
————————————————————————

而在字符型,整型前有一个特殊的关键词修饰他们
他们是关键字 signedunsigned

signed:表示一个类型带有正负号
unsigned:表示不带有正负号,只有非负数
而在默认情况下,关键字signed一般省略不写

其实每种数据类型都有自己的取值范围,这就是有long,longlong的原因,如果在前面加上关键词**unsigned,**那么在同样长度的内存条里,能表达的最大整数增大了一倍。

变量

数据类型就是为了创造变量,而变量就是经常变化的值,不管在C语言还是在日常生活中

int a;//整形变量
char b;//字符变量
float c;//浮点型变量

这些都是我们创建的不同数据类型变量

如果我们给变量在创建时就给了一个初始化的值
举个栗子:

    int a = 777

那么就叫初始化

变量的分类

  • 全局变量:指在大括号外面定义的变量
  • 局部变量:指在大括号里面定义的变量

举个栗子:

int main ()

int a = 10;
{

     int b = 20;
  return 0;

}

其中a为全局变量,b为局部变量

如果全局变量和局部变量同名时局部变量优先使用
举个例子:

#include <stdio.h>
int main ()

int a = 10;
{
    int a = 20;
    print("a");
   return 0;
}

此代码运行后打印结果应为20

在内存中分为三个区域,分别为:栈区,堆区,静态区(内存不是我们熟知的512g又或者1t,它叫存储空间,而是16g那种的运行内存),其中全局变量放在内存的栈区全局变量放在内存的静态区

算术操作符

分别有+ , - , * , / , %,当代码涉及到计算时我们可以用这些算数操作符计算
其中+就是加法,-就是减法,*就是乘法,/就是除法,%就是求模,因为这些操作符都会有两个操作数,分别于操作符的两端,所以也叫双目操作符

其中除法较特殊,因为涉及到整数和浮点数,我们在具体讲解:
如果两边都是整数,例如8/2那么结果会是整数4,但如果是9/2,结果会是4,因为输出的是整数,所以只会返回整数部分,后边的0.5就会丢失,如果我们想让他输出为小数(浮点数),那么需要除号 / 两边的运算数至少有一个是小数(浮点数)的形态,例如9.0/4

求模运算符中,只能运算整数,不能用于浮点数,如果是负数求模,结果的正负号由第一个正负号决定

赋值操作符

=是一个给变量赋值的操作符
例如:

int a = 1

如果遇到连续赋值

int a = 1
int b = 2
int c = 3
c = b = a + 1

从右往左计算
可以拆成

b = a + 1
c = b

而为了方便运算,会有一些复合运算符
像是a = a + 1可以写为a += 1,像这样的还有-=,*=,/+,%=,等,和前面+=用法相同

单目操作符

++和–,就是给自身本来的值加一或者是减一

int a = 4
a = a++
printf("a")

打印的值为5
因为单目操作符的位置不同,分为在变量前和在变量后++aa++,分别称为前置++后置++,他们的含义不一样,前置++要是碰到赋值情况,举个例子:

int a = 0
int b = = ++a

他先会给自身加上1后在赋值给b,b的值是1

如果是后置++,举个例子:

int a = 0
int b = a++

他会先给b赋值后再给自身加上1,b的值是0

总结就是:前置++先加后使用,后置++使用在加前置- -和后置- - 同理

而单目操作符的+和-对应的是正号和负号,在负号前面加上-结果会变为正数

强制转换类型

感觉用的比较少,举个例子:

int a = 7.77777//致敬一下我的高中同学,因为a是整型,后面的赋值是浮点型,这样会报错
//这时用强制转换类型
int a = (int)7.77777
//这时强制转换类型将7.77777转换为整型,不会报错

scanf和printf

个人觉得是比较重要的部分,很多人的启蒙“hello world”就是从这里来的

printf

printf输出作用,作用是将文本内容输出到电脑屏幕中
printf是标准库的头文件<stdio.h>定义的,所以在使用时应该在使用printf函数之前在源码文件头引入这个头文件

#include <stdio.h>
int main()
{
  printf("111");
return 0;
}

代码最上面的那一行就是在源码文件头引入这个头文件

printf函数输出数据有两种常见的格式,一种是像上一个代码一样直接在双引号中输入想要输出的数据,一个就要运用到占位符

常见的占位符整数占位符%d字符占位符%c字符串占位符%s等等
表示格式为:

#include <stdio.h>
int main()
{
  printf("%d",5);
return 0;
}

在以上代码中%d占据了一个位置,后面的5来填补这个占据的位置

我们也可以限制printf函数的最小宽度
举个栗子:

#include <stdio.h>
int main()
{
  printf("%5d",111);//输出结果为“  111”
return 0;
}

如果先让他靠前对其,只需要在5前面加一个-
举个栗子:

#include <stdio.h>
int main()
{
  printf("%-5d",111);//输出结果为“111  ”  
return 0;
}

如果输出大于最小宽度呢?

#include <stdio.h>
int main()
{
  printf("%5d",1111111);//输出结果为1111111
return 0;
}

因为只是限定最小宽度,大于最小宽度不会限制

如果想让他输出的值时刻带正负号(因为默认情况下printf函数不对正数显示+)可以选择%+d这样输出的结果都会带正负号

我们也可以限制他的小数位数
如果我们想保留小数后两位
我们可以这么做:

#include <stdio.h>
int main()
{
  printf("%.2f",1.123);//输出结果为1.12
return 0;
}

就是在%f中间加一个{.(你想要保留的小数点后几位)f}

也可以限制字符串的位数方法与限制小数位数相似,将占位符改写为%.(想限制到的字符串位数)s

#include <stdio.h>
int main()
{
  printf("%.2s",aaaaa);//输出结果为aa
return 0;
}

scanf

scanf是一个输入函数,用法与printf相似,下面我写一个基本的代码:

#include <stdio.h>
int main()
{
  int a = 0;
  scanf("%d",&a);
  printf("%d",a);
return 0;
}

如果运行到这一步代码会报错,这时要在代码前面加上#define _CRT_SECURE_NO_WARNINGS 1
像这样:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
  int a = 0;
  scanf("%d",&a);
  printf("%d",a);
return 0;
}

代码就可以正常运行(其中&就是读取a的地址,方便输入)

如果想要输入多个变量,scanf函数可以忽略空白字符(空格,制表符,换行符等),所以在输入数据的时候,有空格和分为几行都不影响,scanf函数解读的原理是,解读用户输入时,先放入缓存,等按下空格键后,按照占位符对缓存进行解读,解读会从上次遗留的第一个字符开始直到读完缓存,或者是遇到第一个不符合的条件的字符为止

占位符的运用和printf函数基本一致,但是在scanf函数中,%c不忽略空白字符,如果想要强制跳过空白字符,在%c前面加一个空格,即scanf (" %c", &c)

赋值忽略符

这个有点难理解 简单的说就是,如果用户输入的不符合预定格式,会导致解析数据失败

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
  int year = 0;
  int month = 0;
  int day = 0;
 
  scanf("%d-%d-%d",&year,&month,&day);
  printf("year month day");
return 0;
}

如果用户不输入对应的格式,例如2024/7、24程序就会报错
这时,我们运用赋值忽略符*只要把*加到任何%后面,该占位符就不会返回值,解析后会被丢弃,相当于此占位符输入的东西不重要,反正都会被抛弃,对程序产生不了影响

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
  int year = 0;
  int month = 0;
  int day = 0;
 
  scanf("%d %*c %d %*c %d",&year,&month,&day);
  printf("year month day");
return 0;
}

这样就不会有上述情况产生


这章的内容就讲完啦,因为我也是新手,如果有问题请多多指点,大家一起进步哦(笔芯)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值