Linux开发之C语言基础
1、常量:
数字 十进制数(Dec) 20
八进制(Oct) 024
十六进制(Hex) 0x14
二进制数(Bin) 0b10100
字符 ‘ ‘ man ascii :
2、转义字符 在字符中用\表示:
3、还有和八进制或者十六进制数字联合一起的转义字符,表示取对应的ASCII码值:
4、练习:
定义一个char类型变量, 尝试用不同的方式给该变量赋值, 并打印结果;
char x = ‘a’;
char y = 97;
printf(“x = %c , x=0x%x \n”, x, x );
printf(“y = %c , y=0x%x \n”, y, y );
字符串 “ ”
“hello” 只要有双引号,在字符串的最后就会有一个空字符’\0’
‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘\0’
5、变量:
在运行过程中数值会发生变化的
变量名是由字母和下划线开头,由数字、字母、下划线组成的
定义一个字符型变量
char c = ‘a’ ; // 用常量‘a’给变量c赋初值
char _3c = ‘a’ ;
char val = ‘a’ ;
以上,实际写入到内存的是字符‘a’所对应的ASCII码值
Oct Dec Hex Char
141 97 61 a
char c = ‘a’ ; ==等价于=> char c = 97 ;
变量的定义:
按数据类型在内存中申请指定大小的字节空间
1)【数据的作用域】 数据类型 变量名;
2)【数据的作用域】 数据类型 变量名 = 初值;
作用域: static 静态变量 ,按需求设置
数据类型 : 是必须的
基本数据类型有:
6、%d需要把这个数据当成是带符号的补码,需要显示出其原码:
7、思考: char a = 135;
和 unsigned char b = 135 ;
实际写入内存的有没有区别? (没有)
在使用的时候有没有区别?
(自动类型转换 带符号转成无符号~)
a+5 和 b+5的结果是否一致
结果用打印没有区别
short 短整型
占用2个字节(2Byte , 2B)
(-215~~ 215-1 )
unsigned short (0~~ 216-1 )
int 32位占用4个字节(4Byte , 4B)
64位占用4个字节(4Byte , 4B)
unsigned int
float 单精度浮点型 带有小数点 %f
32位占用4个字节(4Byte , 4B)
64位占用4个字节(4Byte , 4B)
unsigned float
float x = 0.01;
float x = 1e-2 ;
float y = 10000.0;
float y = 1e4 ;
long 长整型 %ld %lu %lx
32位占用4个字节(4Byte , 4B)
64位占用8个字节(4Byte , 4B)
unsigned long
double 双精度浮点型 带有小数点的 %lf
32位占用8个字节(4Byte , 4B)
64位占用8个字节(4Byte , 4B)
unsigned double
long double类型用%llf打印
bool / _Bool
需要加头文件
#include <stdbool.h>
布尔变量, 用来判断真假及条件是否成立,只能是0或者1
true 为1 false 为0
类型转换
int a = 5;
double b = a / 2 ;
请问b为多少 2.000000 在除的时候,a依旧是int整型,
a/2得到的是整数部分,所以就是整数2
赋值的时候double就会把2变成是带小数点的浮点数,赋值给b (自动类型转换)
a / 2 为多少 a/2得到的是整数部分,所以就是整数2
(double)a/2 其中是先对整型变量a做了强制类型转换,
在这条语句中暂时作为浮点数进行运算,
(double)a/2得到的就是2.500000
(double) (a/2) 是把a/2的结果强制类型转换,
a/2得到的是整数部分,所以就是整数2
(double)(a/2) = 2.000000
自动类型转换在运算过程中自己转换的
强制类型是针对变量或者表达式或者函数的返回值,用(新类型)来实现强制类型转换
表达式和语句
表达式 由变量、运算符等组成
a=1 a +1 a+b a++ a > b
语句才可以代码中独立存在, 必须有分号
a +=1; a+1 ;
8、运算符
int val = 100;
赋值运算符:
9、算术运算符:
10、关系运算符 是用来描述两个数之间的关系:
11、练习:test1
输入一个小写字符, ‘a’ ‘z’
显示该字符对应大写字符,连续显示4次
输入‘a’ ,输出是AAAA
字符的输入和显示 用%c
char c ;
scanf(“%c” , &c);
for( i=0; i<4; i++ )
printf(“%c”, c-32);
逻辑运算符
逻辑与 &&
条件1 && 条件2
只有这两个条件都满足(条件为真)整个表达式才为真
只要有一个为假就是假
如果条件1已经是假,不会处理条件2
例:判断输入的是否为小写字符:
char c ;
scanf(“%c” , &c); // ‘a’ ‘z’ ‘z’ >= c >= ‘a’ 数学上写法
if( c >= ‘a’ && ‘z’ >= c )
逻辑或 ||
条件1 || 条件2
只有有一个条件满足(条件为真)整个表达式就为真
只有这两个条件都不满足(条件都为假)整个表达式才为假
如果条件1已经是真,不会处理条件2
if ( 小写字符 || 大写字符 )
‘a’ ~ ‘z’ ‘A’ ~ ‘Z’
判断一个字符是否为英文字符
if ( (c >= ‘a’ && ‘z’ >= c ) || (c >= ‘A’ && ‘Z’ >= c ) )
练习 test2.c
输入一个字符, 英文字符或者数字字符
如果是小写字符就显示该字符对应大写字符,连续显示4次
如果是大写字符或者数字字符就显示输入出错
12、----------------------------------------------------------------------------
scanf(“%c”, &ch) 不管键盘的缓冲区里面有什么数据 都会读取之并当成是字符
如果需要清空缓冲区,常用
13、%d只取+-0123456789
%x只取xX0123456789abcdefABCDEF
%s 可以取键盘上所有键值,除了空格和回车
--------------------------------------------------------------------------
逻辑非 !
单目运算符
!条件 如果条件为真, 整个表达式为假
如果条件为假,整个表达式为真
非零就是真
分析: !val
如果val 的值为1 , 请问 !val 判断结果为假
如果val 的值为0 , 请问 !val 判断结果为真
分析 ! (a>b)
如果a的值为10 ,b的值为12,
! (a>b) a>b不成立 ,这个表达式是真的
如果a的值为15 ,b的值为12,
! (a>b) a>b成立 ,这个表达式是假的
位运算符
针对bit做操作 1Byte有8bits
位与运算符 & 对应位相与 都为1才为1 ,否则为0
如 unsigned char val = 10;
val & 0x01 ==》 0000 1010
& 0000 0001
0000 0000
1) 用于判断某一位是为1还是0
如 判断一个unsigned char数据的最低位是否为1
unsigned char val ;
.........
如果 val & 0x01 != 0 说明最后一位是1
如果 val & 0x01 == 0 说明最后一位是0
2) 用来令某一位为0
如 令unsigned char val 的第3位为0
val & 0b11110111
位或运算符 | 对应位相或 都为0才为0 ,否则为1
如 unsigned char val = 10;
val | 0x01 ==》 0000 1010
| 0000 0001
0000 1011
用于把某一位置成1
如 保证unsigned char val 的第4位为1
val | 0b00010000
左移运算 << 把数据按要求向左移动指定位数
直接把高位移走, 低位补0
对数据逐位进行操作
在数据没有越界的情况下, 左移n位就相当于乘以2n
右移运算 >> 把数据按要求向右移动指定位数
直接把低位移走, 如果是带符号数 高位补符号位(负数补1, 正数补0)
如果是无符号数,直接高位补0
对数据逐位进行操作
在非负数进行操作的情况下, 右移n位就相当于除以2n
思考:
如何把无符号char类型的数据对应的十六进制、十进制、八进制、二进制给输出?
unsigned char val ;
scanf(“%hhu” , &val );
printf(“ 0x%hhx , %hhu , 0%hho ”, val , val , val );
二进制数: 1)用整除、模除2的方式
2)利用位与、位移操作得到各二进制的值
位异或 ^
位反 ~
其它运算符