嵌入式系列文章之第一章 C语言の第二节 数据类型、常量、变量及运算符

嵌入式(Linux)系列文章目录

第一章 C语言の第一节 必备Linux命令和C语言基础
第一章 C语言の第二节 数据类型、常量、变量及运算符


文章目录


前言

本文章采用VMware Workstation Pro进行嵌入式(Linux)系列学习

从零开始,重新学习(嵌入式相关内容)并记录知识点(涉及基础c语言(数据结构)、linux编程、shell脚本、文件io、网络编程)等),同时也是为了方便自身回顾,如有不对的地方请大佬多多指教,谢谢!->欢迎评论区留言


第一章 C语言

第二节 数据类型、常量、变量及运算符

1.数据类型

1.1 数据类型分类

数据类型

1.2 基本数据类型(sizeof:32位机)
基本数据类型说明备注(limits.h)
逻辑(bool)类型非零(true):逻辑真值,零(false):逻辑假值库函数<stdbool.h>,_Bool为基本类型
整数类型char:1字节(8bit),short:1字节(8bit),int:2字节(16bit),long:4字节(32bit)
浮点类型float,double
void类型主要用于说明不返回值的函数或指向空类型的指针等
  • 查看各数据类型幅值
enshang@enshang:~$ vi /usr/include/limits.h
  • 代码示例
#include <stdio.h>
#include <limits.h>

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

	printf("char:%d-%d\n", SCHAR_MIN, SCHAR_MAX);
	printf("short:%d-%d\n", SHRT_MIN, SHRT_MAX);
	printf("int:%d-%d\n", INT_MIN, INT_MAX);

	return 0;
}
  • 结果
    各数据类型幅值代码验证结果
1.3 强制类型转换
  • 把变量从一种类型转换为另一种数据类型(主要是为了防止计算数据溢出,而导致最终计算错误所采取的措施)

2.常量

2.1 基本数据类型的常量(在程序运行期间其数值不发生变化的数据)
2.1.1 整形常量(整数)
  • 十进制数(%d):数值
  • 八进制数(%o):0+数值(每个数值占3bit)
  • 十六进制数(%x):0x+数值(每个数值占4bit)

注:打印结果自动加0x前缀的十六进制数

	printf("%#x\n", a);
2.1.2 浮点常量(%f,又称为实数,一般含有小数部分)
  • 只有十进制,分为单精度和双精度
  • 两种表示方法,即一般形式和指数形式
  • [+|-] M.N
2.1.3 指数常量(%e,指数形式的实数,一般是由尾数部分、字母e或E和指数部分组成,通常表示特别大或特别小的数)
  • 数值e+次幂 = 数值*(10^次幂)
  • [+|-]M.N<e|E>[+|-]T
2.1.4 字符常量(%c,一个单一字符,其表示形式是由两个单引号包括的一个字符)
  • 在C语言中,字符常量具有数值。字符常量的值就是字符的ASCII码值(可以把字符常量看做一个字节的正整数)
  • 常用字符常量
('a' - 97) = ('A' - 65) + ('空格' - 32'0' - 48
2.1.5 字符串常量(%s,用双引号括起来的一串字符来表示的数据,字符串以\0结尾)
  • 代码验证
#include <stdio.h>
#include <stdbool.h>

int main(int argc, char *argv[])
{
	char arr1[] = {"A"};
	char arr2[] = {'A','B','C','\0'};
	
	printf("%d, %d\n", sizeof(arr1), sizeof(arr2));
	printf("%s, %s\n", arr1, arr2);
	return 0;
}
  • 结果
    字符串常量代码验证结果
2.2 标识常量(用标识符代替常量使用的一种常量,其名称通常是一个标识符,也叫符号常量,一般用大写英文字母的标识符)
  • 在使用之前必须预先(宏)定义,格式如下(可以在其他宏定义中使用,仅替换!!!)
#define <标识常量名称> <常量>;
  • 一般情况,每个标识常量说明式子只能给出一个标识常量,并且占据一个书写行

注:如果一个串长于一行,可在行尾用反斜线“\”续航

3.变量

3.1 变量的基础
  • 变量在程序中用变量名表示。变量名由用户根据其用途任意命名
  • 变量名由字母、数字、下划线组成,不能以数字开头,不能和C的关键字重名
  • 在程序运行时,变量占据存储空间的大小由其数据类型决定
  • 变量在内存空间中的首地址,称为变量的地址
3.2 变量的说明
  • 变量在程序中使用时,必须预先说明它们的存储类型和数据类型
  • 格式
<存储类型> <数据类型> <变量名>
  • <存储类型>是关键词auto、register、static和extern
  • <数据类型>可以是基本数据类型,也可以是自定义的数据类型
3.3 变量的存储类型
3.3.1 auto
  • auto说明的变量只能在某个程序范围内使用,通常在函数体内或函数中的复合语句里(默认是随机值)
3.3.2 register
  • register称为寄存器型,register变量是想将变量放入CPU的寄存器中,这样可以加快程序的运行速度。如申请不到就使用一般内存,同auto

注:
register必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整形的长度
不能用“&”来获取regi变量的值
由于寄存器的数目有限,真正起作用的register修饰符的数目和类型都依赖于运行程序的机器
在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销

3.3.3 static(static修饰的全部变量,其他文件无法使用)
  • static变量称为静态存储类型的变量,既可以在函数体内,也可以在函数体外说明(默认是0)
  • 局部变量使用static修饰,有以下特点:
  • 在内存中以固定地址存放的,而不是以堆栈方式存放
  • 只要程序没结束,就不会随着说明它的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调用存入的值
3.3.4 extern
  • 当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可引用这个变量
  • extern称为外部参照引用型,使用extern说明的变量是想引用在其他文件中函数体外部说明的变量
  • 要使用2个文件时,要同时编译
enshang@enshang:~$ vi gcc extern1.c extern2.c

4.运算符

4.1 算术运算符
  • C提供的算术运算符:+,-,*,/,%,++

注:float/double不能取余

运算符功能说明举例
加,一目取正a+b
减,一目取负a-b
×(*)乘法a*b
/除法a/b
%取模或求余a%b
++增1a++,++b
减1a–,–b
4.2 关系运算符
  • C语言的关系运算符
运算符功能说明举例
大于a > b
≥(>=)大于等于a >= 5
小于a < x
≤(<=)小于等于x <= y+1
==等于x+1 == 0
!=不等于c != ‘\0’
4.3 逻辑运算符
  • C语言的逻辑运算符
运算符功能说明举例
!逻辑反!(x == 0)
&&逻辑与x > 0 && x < 100
II逻辑或y < 10
4.3.1 逻辑非“!”运算符的运算规律
运算量结果
10
01
4.3.2 逻辑与“&&”运算符的运算规律(短路特性-逢0截止)
左运算量右运算量结果
111
100
010
000
4.3.3 逻辑与“||”运算符的运算规律(短路-逢1截止)
左运算量右运算量结果
111
101
011
000
4.4 位运算符
  • C语言的位运算符
运算符功能说明举例
~位逻辑反~a
&位逻辑与a & b
I位逻辑或a I b
^位逻辑异或a^b
(>>)右移位a << 1
(<<)左移位b >> 4
4.4.1 位逻辑与“&”运算符的运算规律
左运算量的位值右运算量的位值位与结果值
000
010
100
111
4.4.2 位逻辑或“|”运算符的运算规律
左运算量的位值右运算量的位值位或结果值
000
011
101
111
4.4.3 位逻辑异或“^”运算符的运算规律
左运算量的位值右运算量的位值位异或结果值
000
011
101
110
  • 思考
  • 如何利用位运算把一个十进制数转换成一个十六进制数?

答:

#include <stdio.h>

int main(int argc, char *argv[])
{
	int a = 65, b = 0;
	
	printf("%#x %d\n", a, a);
	b = a >> 4; // b = a / 16;
	printf("%#x %d\n", b, b);
	b = a & 0xf; // b = a % 16;
	printf("%#x %d\n", b, b);
	return 0;
}
4.5 赋值运算符
  • 赋值运算符为“=”,其运算的一般格式如下
<左值表达式> = <右值表达式>;
  • 复制复合运算符,其运算的一般格式如下
<变量> <操作符> = <表达式>;
  • C语言的赋值复合运算符
运算符功能说明示例
+=加赋值复合运算符a+=b 等价于 a=a+b
-=减赋值复合运算符a-=b 等价于 a=a-b
*=乘法赋值复合运算符a*=b 等价于 a=a*b
/=除法赋值复合运算符a/=b 等价于 a=a/b
%=求余赋值复合运算符a%=b 等价于 a=a%b
&=位与赋值复合运算符a&=b 等价于 a=a&b
I=位或赋值复合运算符aI=b 等价于 a=a I b
^=位异或赋值复合运算符a^=b 等价于 a=a^b
>>=位右移赋值复合运算符a>>=b 等价于 a=a>>b
<<=位左移赋值复合运算符a<<=b 等价于 a=a<<b
4.6 特殊运算符
4.6.1 条件运算符“?:”
  • 三目运算符,其运算的一般格式
<表达式1>?<表达式2> : <表达式3>;
4.6.2 逗号运算符
  • 从左到右,整个表达式的值由最后一个表达式决定
  • 代码示例
#include <stdio.h>

int main(int argc, char *argv[])
{
	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);
	return 0;
}
  • 结果
enshang@enshang:~$ ./a.out
x=15.500000 y=2.800000 z=18.300000
4.6.3 sizeof运算符
  • 格式
sizeof(<类型或变量名>)

注:它只针对数据类型,而不针对变量!

4.7 运算符的优先级
  • 总表
优先级运算符及其含义结合规律
1[] () . -> 后缀++ 后缀- -从左向右
2前缀++ 前缀-- sizeof & * - ~ !从右向左
3强制类型转换从右向左
4* / % (算术乘除)从左向右
5+ - (算术加减)从左向右
6<< >> (位移位)从左向右
7< <= > >=从左向右
8== !=从左向右
9& (位逻辑与)从左向右
10^ (位逻辑异或)从左向右
11I (位逻辑或)从左向右
12&&从左向右
13II从左向右
14?:从右向左
15= *= /= %= += -= <<= >>= &= ^==
16,从左向右
  • 详情
    运算符的优先级上
    运算符的优先级下

总结

本章为嵌入式学习系列文章 第一章:C语言の第二节 数据类型、常量、变量及运算符

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值