C语言基本数据类型和变量

C Language NO.1 数据类型和变量

  • 前言
    • 1.常量和变量
    • 2.基本数据类型
    • 3.运算符
    • 4.输入输出函数
  • 总结


前言

我的初衷是写一个C语言系列文章来记录自己的学习过程,我的目标是尽量多整点代码来解释某个知识的应用,毕竟学习一门语言多敲代码才能学好。如果有什么异议和谬误的地方还请阅读者多多谅解和指正,这里谢谢大家的观看~

C语言是一种工业语言,用途广泛、功能强大、使用灵活的过程性编程语言可以用在许多方面,如:操作系统、嵌入式系统、驱动程序、底层驱动、图形引擎、图像处理、声音效果等。

1.常量和变量

常量是固定值,在程序执行期间不会改变。
常量有整型常量、浮点常量、字符常量、字符串常量、符号常量

  1. 整型常量,如 0、100、-24 等。
  1. 浮点常量,它由整数部分、小数点、小数部分和指数部分组成。如 3.14159、3.14e4(代表3.14x10^4) 等。
  1. 字符常量,一种是普通字符,如 ‘A’ 、‘Z’、’?’ ;另一种是转义字符,如 ‘\n’ 换行输出。这里不在着重介绍转义符。
  1. 字符串常量 ,如 “boy” “123” 等。
  1. 符号常量,用#define指令,指定用一个字符代表一个常量。(即原样替换) 注:符号常量不占内存,只是一个临时符号,代表一个值,在预编译后这个符号就不存在了,习惯上用大写表示,如PRICE 等。

变量是一个存储单元,一个存储数据的容器,可以在程序执行期间随时更改,可以用来存储任何类型的数据,变量必须先定义后使用,变量名由字母、数字、下划线组成,不能以数字开头,不能和C语言中关键字重名。

<如何使用变量>
首先定义好变量的名字和类型 int A;
然后是给变量赋值,即变量初始化 int A=10;
最后是变量的调用 printf("A=%d\n",A);

const是一个修饰符,加在int的前面,表示这个变量的值一旦初始化就不能再修改了。
const int A=10;
A=20;
这样代码会出现错误。

2.基本数据类型

在C语言中,数据类型是非常重要的概念之一。一个变量的数据类型决定了它能够存储的数据种类和范围,也决定了对该变量进行操作的方式和限制。
计算机中数据的存储方式是用整数的补码形式存放,从左到右第一位为0表示正数,为1表示负数, 正数的补码是他自己二进制形式,负数的补码:先将此数的绝对值写出二进制形式,然后对其所有二进制按位取反,再加1,符号位不变。<参考数字电路第一章数制与码制>

整型数据
整型数据类型在编程中扮演着重要角色,用于存储和处理整数值、控制程序流程以及处理数字计算等任务。一个字节(Byte)是8bit(位)。

  • char型,字符型占用1个字节。
  • short型,短整型占用2个字节。
  • int型,整型占用4个字节。
  • long型,长整型占用 4 或 8 个字节,具体取决于编译器和操作系统的位数。
  • long long型,双长整型占用8个字节。

C 语言标准库中定义了带符号和不带符号的整型数据类型
带符号如:

  • int8_t ,signed char:有符号8位字符型,范围-128 到 127
  • int16_t ,short:有符号的16位短整型,范围-215到215-1
  • int32_t,int:有符号的32位整型,范围-231到231-1

不带符号如:

  • uint8_t,unsigned char无符号字符型:0 到 28-1
  • uint16_t,unsigned short无符号短整型:0 到 216-1
  • uint32_t,unsigned int无符号整型:0 到 232-1

浮点型数据
我们在计算平均值、圆的面积、温度转换,会遇到一些带小数点的数据,这时就需要用到浮点型数据,来保证数据的准确性,同时在C语言中两个整数的运算结果只能是整数,1是整数 1.0是浮点数,它们是不同的。

单精度浮点型float型,占用4个字节,使用32位二进制表示可以存储6位有效数字;
双精度double型,占用8个字节可以存储15位有效数字;

平均值计算

#include <stdio.h>

int main() {
    float num1 = 5.5;
    float num2 = 3.2;
    float average = (num1 + num2) / 2;

    printf("平均值是:%f\n", average);
    
    return 0;
}

平均值是:4.350000

圆的面积

#include <stdio.h>

int main() {
    float radius = 4.5;
    float pi = 3.14159;
    float area = pi * radius * radius;

    printf("圆的面积是:%f\n", area);

    return 0;
}

圆的面积是:63.617199

温度转换

#include <stdio.h>

int main() {
    float celsius = 25.0;
    float fahrenheit = (celsius * 9/5) + 32;

    printf("%.2f摄氏度等于%.2f华氏度\n", celsius, fahrenheit);

    return 0;
}

25.00摄氏度等于77.00华氏度

在printf函数中,%f用于打印单精度浮点型变量的值,%lf用于打印双精度浮点型变量的值,%.2f表示保留两位小数、%.3f表示保留3位小数。

3.运算符

关于运算符,C语言提供的有不少种类,如下面:
算术运算符
它是加减乘除,像+ - * /,特别的取余%,自增++,自减--

    int a = 10, b = 4;
    printf("a+b=%d\n", a + b);// 加法 a+b=14
    printf("a-b=%d\n", a - b);// 减法 a-b=6
    printf("a*b=%d\n", a * b);// 乘法 a*b=40
    printf("a/b=%d\n", a / b);// 除 a/b=2
    printf("a%%b=%d\n", a % b);// 取模 a%b=2

取余运算常用于判断是否能够整除。如果 a % b 的结果为 0,则说明 a 能够被 b 整除。
1.取余运算的结果始终是一个整数。
2.如果被除数 a 小于除数 b,则结果为 a。
3.如果被除数 a 等于除数 b 的倍数,结果为 0。
4.如果被除数 a 为负数,则取余运算的结果也为负数。

除法运算
1.如果被除数 a 小于除数 b,则结果为 0。
2.如果被除数和除数都是整数,则结果也是整数,如果存在小数,则结果会被截断为整数。
3.如果被除数或除数是浮点数,则结果也是浮点数。
4.在计算机程序中,除数不能为 0,否则会导致程序异常。因此,在进行除法运算时,通常需要检查除数是否为 0。

自增运算(自减同理)
C语言提供了两种自增运算符:前缀自增运算符(++i)和后缀自增运算符(i++)。它们的作用是将变量的值增加1。

++i 先将变量的值加1,然后返回新的值。
i++ 先返回变量的当前值,然后再将其加1。

关系运算符
就是比较两个数据大小关系,像< >,>= <=,== !=
常用在if或while判断语句中,如if(x == y)判断x是否等于y。

==:等于
!=:不等于
< : 小于
> : 大于
<=:小于等于
>=:大于等于

逻辑运算符
即与或非运算,如与运算&&,或运算||,非运算

与运算符(&&):表示只有当所有条件都为真时,结果才为真。
或运算符(||):表示只要有一个条件为真,结果就为真。
非运算符(!):用于对逻辑值取反,即将真变为假,将假变为真。

int a = 5;
int b = 10;
int c = 3;
if (a > b && a > c) {
    printf("a is the largest number.\n");
}
//如果a大于b且a大于c,则输出"a is the largest number."。否则,条件不满足,不执行printf语句块。

位运算符
用于对整数值的二进制位进行操作。如左移<<,右移>>,按位与&,按位或|,按位异或^,按位取反~
1、按位与&:对两个操作数的每个对应位执行逻辑与操作。对应位上的操作数位都为1时,结果为1;否则,结果为0。

unsigned int a = 5;  // 二进制表示为 00000101
unsigned int b = 3;  // 二进制表示为 00000011
unsigned int result = a & b;
printf("%u\n", result);  // 输出 1
//解释:a和b进行按位与操作,得到的结果是00000001,即十进制的1。

2、按位或|:对两个操作数的每个对应位执行逻辑或操作。对应位上的操作数位有一个为1时,结果为1;否则,结果为0。

unsigned int a = 5;  // 二进制表示为 00000101
unsigned int b = 3;  // 二进制表示为 00000011
unsigned int result = a | b;
printf("%u\n", result);  // 输出 7
//解释:a和b进行按位或操作,得到的结果是00000111,即十进制的7。

3、按位异或^:对两个操作数的每个对应位执行逻辑异或操作。对应位上的操作数位不相同时,结果为1;否则,结果为0。

unsigned int a = 5;  // 二进制表示为 00000101
unsigned int b = 3;  // 二进制表示为 00000011
unsigned int result = a ^ b;
printf("%u\n", result);  // 输出 6
//解释:a和b进行按位异或操作,得到的结果是00000110,即十进制的6。

4、按位取反~:对操作数的每个位执行逻辑非操作,即将0变为1,将1变为0。

unsigned int a = 5;  // 二进制表示为 00000101
unsigned int result = ~a;
printf("%u\n", result);  // 输出 4294967290
//对a进行按位取反操作,得到的结果是11111010,即十进制的4294967290(根据系统的位数可能会有所不同)。

5、左移<<:将操作数的各个位向左移动指定的位数。

unsigned int a = 5;  // 二进制表示为 00000101
unsigned int result = a << 2;
printf("%u\n", result);  // 输出 20
//将a向左移动2位,得到的结果是00010100,即十进制的20。

6、右移>>:将操作数的各个位向右移动指定的位数。示例:

unsigned int a = 5;  // 二进制表示为 00000101
unsigned int result = a >> 2;
printf("%u\n", result);  // 输出 1
//将a向右移动2位,得到的结果是00000001,即十进制的1。

赋值运算符
用于将一个值赋给变量,它的左边是要赋值的变量,右边是要赋给变量的值。

int a = 5;
a += 3;  // 相当于 a = a + 3;
a -= 3;  // 相当于 a = a - 3;
a *= 3;  // 相当于 a = a * 3;
a /= 3;
a %= 3;
...

条件运算符
也叫三目运算符

一般形式:<表达式1>?<表达式2>:<表达式3>
如果表达式1成立(真),输出结果为表达式2,
如果表达式1不成立(假),输出结果为表达式3。

int x,y=25;
  x=70;
  y=x++ > 70?100:5;
  printf("x=%d y=%d",x,y);
 //运行结果 x=71 y=5

逗号运算符
用于将多个表达式连接在一起,并按照从左到右的顺序依次执行这些表达式,最终返回最后一个表达式的值。
它可以在一个赋值语句中使用逗号运算符同时赋值多个变量

int a, b, c;
a = 1, b = 2, c = 3; // 等价于 a = 1; b = 2; c = 3;

也可以在函数调用中使用逗号运算符传递多个参数

printf("%d, %d, %d", a, b, c); // 输出 1, 2, 3

例如使用了逗号运算符来计算(x += 5, y++, x + y)的值

float x = 10.5, y = 1.8, z;
z = (x += 5, y++, x + y);
printf("x=%f y=%f z=%f\n", x, y, z);
//运行结果 x=15.500000  y=2.800000  18.299999

逗号运算符的作用是先执行表达式1,然后执行表达式2,再执行表达式3,以此类推,直到最后一个表达式n。整个表达式的值是最后一个表达式的值。
逗号运算符的优先级是最低的,因此在使用逗号运算符时应注意使用括号来明确运算的顺序。

强制类型转换运算符
在进行计算或赋值操作时,如果涉及到不同类型的变量,编译器会根据一定的规则进行自动类型转换,以便保证表达式的正确性和一致性,利用强制类型转换运算符将一个表达式转换成所需类型。

格式:(类型名) (表达式)

int x = 10;
double y = 3.14;
int z = (int) y;  // 强制将y转换为整型
double result = (double) x / y;  // 强制将x转换为浮点型

sizeof运算符
sizeof是一个一元运算符,用来计算数据类型或变量所占的字节数。它可以用在任何数据类型或变量前面,也可以用在表达式中。

功能:用来测试指定的变量或者数据类型所占字节的大小
方式:sizeof(变量名/数据类型);

	printf("%d\n", sizeof(char));
	printf("%d\n", sizeof(short));
	printf("%d\n", sizeof(int));
	printf("%d\n", sizeof(long));
	//结果是1 ,2 ,4 ,4 即每个数据类型分别占1,2,4,4个字节

4.输入输出函数

printf输出函数是把计算机数据输出到屏幕上,可以用它来做一些事情,如
原样输出

printf("hello world!");

输出整数

int num = 10;
printf("The number is: %d\n", num);
结果:The number is: 10

输出浮点数

float f = 3.14;
printf("The value of pi is: %.2f\n", f);
结果:The value of pi is: 3.14

输出字符

char c = 'A';
printf("The character is: %c\n", c);
结果是:The character is: A

输出字符串

char str[] = "Hello, world!";
printf("The string is: %s\n", str);
结果是:The string is: Hello, world!

观察上面的代码,会发现 printf函数的一般格式为 printf(“格式控制\n”,输出列表)
格式控制是用双撇号括起来的一个字符串,简称格式字符串;
输出列表是程序需要输出的一些数据,可以是常量、变量或表达式;
其中由“%”和格式字符组成的是格式声明,作用是将输出的数据转换为指定的格式后再输出,"\n"为换行输出,下面是常用的格式字符。

%d:输出带符号的十进制整数。
%u:输出无符号的十进制整数。
%f:输出浮点数。
%e 或 %E:以指数形式输出浮点数。
%c:输出字符。
%s:输出字符串。
%x 或 %X:输出无符号的十六进制整数(小写或大写)。
%o:输出无符号的八进制整数。
%p:输出指针地址。
%%:输出一个百分号。

输入函数scanf
该函数可以通过键盘把数据输入到计算机,如scanf("%d",&a),输入的整数会存放在变量a里面。
简单使用

int a;
printf("请输入一个整数:\n");
scanf("%d",&a);
printf("输入结果是:%d\n",a);

***说明:***scanf("%d%d",&a,&b)scanf("%d,%d",&a,&b)是不同的
前者scanf会读取两个整数值,且这两个整数值之间必须以空格、制表符或换行符分隔,否则将匹配失败。
后者scanf会读取两个整数值,但这两个整数值之间必须以逗号分隔。

一般形式:scanf(格式控制,地址列表)
scanf("%d",&a);
"%d"表示需要读取一个整数,&为取地址符,&a表示将读取到的整数赋值给变量a。

在使用scanf函数读取字符串时,不需要使用取地址运算符&

char leader_name[20];
scanf("%s", leader_name);
scanf("%s", &leader_name);
//在第一种方式中,leader_name是数组名,在使用scanf函数时会将输入的字符串直接存储到数组中。
//第二种方式中,&leader_name表示的是数组的地址,这是错误的用法。

字符输入函数getchar
用于从标准输入(通常是键盘)中获取一个字符。

int ch;
printf("请输入一个字符:");
ch = getchar(); // 从标准输入中获取一个字符
printf("你输入的字符是:%c\n", ch);
char ch;
printf("请输入一个字符:");
scanf(" %c", &ch); // 注意%c前面的空格,用于吸收换行符
printf("你输入的字符是:%c\n", ch);

字符输出函数putchar
用于将一个字符输出到标准输出设备(通常是屏幕)

char ch = 'A';
putchar(ch); // 将字符'A'输出到屏幕上
char ch = 'B';
printf("%c", ch); // 将字符'B'输出到屏幕上

总结

以上简单介绍了C语言比较常见的int型、char型、float型、double型等数据类型;常量和变量,变量加上const关键字就不能改变;运算符也很重要,在进行变量操作的时候往往需要用到运算符来帮助处理变量的数据;printf和scanf在使用的时候还是有区别的printf("%d",a),scanf("%d",&a)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值