嵌入式(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 整形常量(整数)
注:打印结果自动加0x前缀的十六进制数
printf ( "%#x\n" , a) ;
2.1.2 浮点常量(%f,又称为实数,一般含有小数部分)
2.1.3 指数常量(%e,指数形式的实数,一般是由尾数部分、字母e或E和指数部分组成,通常表示特别大或特别小的数)
2.1.4 字符常量(%c,一个单一字符,其表示形式是由两个单引号包括的一个字符)
( '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 变量的基础
3.2 变量的说明
< 存储类型> < 数据类型> < 变量名> ;
3.3 变量的存储类型
3.3.1 auto
3.3.2 register
注: register必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的值,并且长度应该小于或者等于整形的长度 不能用“&”来获取regi变量的值 由于寄存器的数目有限,真正起作用的register修饰符的数目和类型都依赖于运行程序的机器 在某些情况下,把变量保存在寄存器中反而会降低程序的运行速度。因为被占用的寄存器不能再用于其它目的或者变量被使用的次数不够多,不足以装入和存储变量所带来的额外开销
3.3.3 static(static修饰的全部变量,其他文件无法使用)
3.3.4 extern
enshang@enshang: ~ $ vi gcc extern1. c extern2. c
4.运算符
4.1 算术运算符
注:float/double不能取余
运算符 功能说明 举例 + 加,一目取正 a+b - 减,一目取负 a-b ×(*) 乘法 a*b / 除法 a/b % 取模或求余 a%b ++ 增1 a++,++b – 减1 a–,–b
4.2 关系运算符
运算符 功能说明 举例 > 大于 a > b ≥(>=) 大于等于 a >= 5 < 小于 a < x ≤(<=) 小于等于 x <= y+1 == 等于 x+1 == 0 != 不等于 c != ‘\0’
4.3 逻辑运算符
运算符 功能说明 举例 ! 逻辑反 !(x == 0) && 逻辑与 x > 0 && x < 100 II 逻辑或 y < 10
4.3.1 逻辑非“!”运算符的运算规律
4.3.2 逻辑与“&&”运算符的运算规律(短路特性-逢0截止)
4.3.3 逻辑与“||”运算符的运算规律(短路-逢1截止)
4.4 位运算符
运算符 功能说明 举例 ~ 位逻辑反 ~a & 位逻辑与 a & b I 位逻辑或 a I b ^ 位逻辑异或 a^b (>>) 右移位 a << 1 (<<) 左移位 b >> 4
4.4.1 位逻辑与“&”运算符的运算规律
左运算量的位值 右运算量的位值 位与结果值 0 0 0 0 1 0 1 0 0 1 1 1
4.4.2 位逻辑或“|”运算符的运算规律
左运算量的位值 右运算量的位值 位或结果值 0 0 0 0 1 1 1 0 1 1 1 1
4.4.3 位逻辑异或“^”运算符的运算规律
左运算量的位值 右运算量的位值 位异或结果值 0 0 0 0 1 1 1 0 1 1 1 0
答:
#include < stdio. h>
int main ( int argc, char * argv[ ] )
{
int a = 65 , b = 0 ;
printf ( "%#x %d\n" , a, a) ;
b = a >> 4 ;
printf ( "%#x %d\n" , b, b) ;
b = a & 0xf ;
printf ( "%#x %d\n" , b, b) ;
return 0 ;
}
4.5 赋值运算符
< 左值表达式> = < 右值表达式> ;
< 变量> < 操作符> = < 表达式> ;
运算符 功能说明 示例 += 加赋值复合运算符 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 ^ (位逻辑异或) 从左向右 11 I (位逻辑或) 从左向右 12 && 从左向右 13 II 从左向右 14 ?: 从右向左 15 = *= /= %= += -= <<= >>= &= ^= = 16 , 从左向右
总结
本章为嵌入式学习系列文章 第一章:C语言の第二节 数据类型、常量、变量及运算符