整数 : (short int long (long long))
signed 有符号数
unsigned 无符号数
字符型 : char
bool类型 :
类型名称 值 域
bool 非零(true), 零(false)
bool (不是基本数据类型 ??)需要引入包 #include<stdbool.h> _Bool为基本数据类型
if(-1) 这个判断的结果为 if(true) 非零为true
bool a = -1 ;
if(a){
printf("%d\n",a) //打印出来的确是1 ,因为<stdbool.h>true为1非零
}
gcc -E bool.c -o bool.i (文件预处理 并输出到bool.i文件, vi bool.i打开该文件)
stdio.h所在目录
我们的头文件所在目录
C99才引入的新的数据类型_Bool 布尔值 原生bool 为 _Bool
我们去根据这个路径打开这个头文件看33行
如果你的代码当中想用到 true 和 false 那就需要引入 <stdbool.h>
如果你的代码中不想用到true和false 那就用 _Bool就可以不用引入头文件
例如: _Bool a;
有些类型受系统的影响值也会受影响 , 比如 : long
以下是以 32位操作系统为例的数据
类型名称 | 长度(字节) | 值 域 |
---|---|---|
char | 1 | -128~127 或 (0~255使用/J编译选项) |
signed char | 1 | -128~127 |
unsigned char | 1 | 0~255 |
- 128需要特殊记忆 补码在内存当中为 1000 0000
补码(two’s complement) 1、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 2、补码与原码的转换过程几乎是相同的。
short类型(32位操作系统)
类型名称 | 长度(字节) | 值 域 |
---|---|---|
short(signed short) | 2 | -32768~32767 |
unsigned short) | 2 | 0~65535 |
int类型(32位操作系统)
类型名称 | 长度(字节) | 值 域 |
---|---|---|
int(signed int) | 4 | -2147483648~2147483647 |
unsigned int) | 4 | 0~4294967295 |
#include<stdio.h>
int main(int argc, char *argv[])
{
printf("%d %d %d %d",sizeof(_Bool),sizeof(char),sizeof(short),sizeof(int));
return 0;
}
<limits.h> 各种类型的数值范围 引用包
vi /usr/include/limits.h
我们可以用代码编写输出一下
数值第一位 为0代表是 八进制数
数值第一位 为0x代表是 十六进制数
注意 :常量赋值的时候一般没有二进制
%c是输出字符的值
%d 十进制数 %x十六进制数 %o八进制数
%f 表示按浮点数的格式输出 %e 表示按指数形式的浮点数的格式输出 %g 表示自动选择合适的表示法输出
单引号引起来的内容一定是一个符号 , 哪些字符可以用单引号引起来得查ASCII码表
在C语言中 , 字符常量具有数值. 字符常量的值 就是字符的ASCII码值
可以把字符常量看做一个字节的正整数
大写转小写 + 空格 也就是 +32
小写转大写 - 空格 也就是 -32
在ASCII表中字符 ‘0’ 的十进制数为 48
如果字符’0’ 想转成真正的数字0 如下
int a = ‘0’ - 48;
任意数字字符想转成真正数字 就是 -48
同理如果数字1-9想转成字符 就是+48
char arr[4] = {“abc”}; == char arr1[4] = {‘a’,‘b’,‘c’,’\0’}; 这两个数组是等价的
char arr[] = {“abc”}; 如果不写数组的个数, 默认是以后面赋值的总个数. 默认或有 ‘\0’
字符串是以 \0结尾 , “5” 是由 ‘5’ , ‘\0’ 组成的
sizeof(arr) 是获取这个数组的长度
%s是 打印字符串
宏
如果我在代码当中很多地方 用到了3.1415926 我们可以定义诶PI来代表
还有一个好处就是如果 我感觉 3.1415926还不够精确需要改一下, 只需要改PI的值就可以
标识常量在运算的时候 会展开, 它只是作为数值替换
宏的语用一般后面都是一些复杂的式子, 如果你不想让它展开就加( ) 能加括号的地方都要加( )
scanf("%f ",&n); 用户通过手动输入字符到控制台
变量名由字母 , 数字 , 下划线组成, 不能以数字开头 , 不能和C的关键字重名 .
在程序运行时 , 变量占据存储空间的大小由其数据类型决定 .
变量在内存空间中的首地址 , 称为变量的地址 .(你要是想知道变量放到了内存中的什么地方)
存储类型有四种
默认的auto 局部变量
在函数体的某程序段内说明auto存储类型的变量
如果你不给变量赋值,那么它的值就是随机的(类似与java中方法里的变量)
%P 内存当中的地址
static 可以是全局变量,也可以是局部变量 ,值默认是0
a每次都是1 ,因为int a 在不断初始化
static 每次不用初始化了 ,
只要程序没有结束,它就不会被销毁 ,
在内存中以固定地址存放的,而不是以堆和栈的形式存放的
函数体外的意思就是全局变量 ,全局变量是能被其他文件访问的
:vsp 加文件名 可以进行分屏显示
另一个文件只需要int global_a = 101; 不需要main方法,不需要引用包
当你想使用别的文件的全局变量的时候可以加extern
static修饰一个全局变量 ,其他文件无法使用
~ 意思是二进制数取反, 0 变 1 , 1 变 0
%x输出16进制数 %#x 这里#号意思是自动增加0x前缀 %o 输出8进制数
16进制数 一个数对应4个进制位 8进制数 一个数对应3个进制位
相异为真 true 非零 相同为假 false 为零
1<<2
1的二进制为 0000 0001 左移2位 0000 0100. 如果再转成10进制就是4。
如果 值++ 在做判断语句的时候 是先拿出值来做对比, 然后在进行值++
逗号运算符的执行顺序是从左到右.
cat 文件名 意思是显示文件内容
x++ 和 ++x 如果遇到判断 x++ 是先拿x判断再进行++ , ++x是先++后判断
m这个8d和2d 8指输出数据的宽度 ,如果位数够就正常打印,不够用空格补录 ,如果写成
%-8d意思是在数的后面
.n是小数点的精度 , 默认输出小数点位数为六位
08d 意思是之前是补空格,现在是补零
ctrl + d 返回值为-1 结束键盘输入
scanf
不能再scanf中写提示语句,那样的话只能自己提示自己,需要自己手动敲please inpt:
一个变量值为1 , 如果你的变量是int ,而你输入的是字母 那得到的就是0
%ld %hd
*号的值是扔掉的不会赋值给变量
两种格式的区别
这里的c1 c2 c3是变量名
输入int值x 回车, 紧接着再输入char 值 a 那么能不能正确的赋值给 x和ch???
输入int值后回车, 留下了垃圾符号回车影响了char 值a的赋值 ? 如何去回收这个垃圾符号呢 ?
getchar(); 把回车获取到, 不影响底下的输入赋值
这种方法比上面的getchar()要方便的多., 直接在输入前加空格 或者%*c就行
输入打印字符串方法 ,为什么会报异常 , 因为我们的给定的数组长度是有限的, 如果用户输出超出我们定义的长度就会报错 , 会造成栈溢出 ,如果你定义的是5个字符,那么你最多能输入 4个, 因为字符数组默认是以 \0作为结束标志的 , scanf()输入的时候如果输入空格,那么字符串会以空格为截至符,. 之后输出的都不显示 ,如果想用scanf()把空格也赋值,能用用%c循环一个一个赋值 , gets不会以空格作为字符串的结束标志
这个puts输出完后会自动换行 , 里面可以存空格
开根号 ,sqrt 需要头文件编译的时候加上
gcc -lm 相当于一个链接选项