C语言基础
编译程序
- gcc xx.c,他会默认生成a.out的可执行文件,在a.out所在目录,执行./a.out
- gcc xx.c -o xx,生成一个xx可执行文件,注意不要命名成xx.c,这样会覆盖原先xx.c文件内容
- gcc xx.c -o xx -g -Wall的意思是开启所有的语法警告
- gcc之检查语法错误
- 每次修改完,c程序都必须要执行一次gcc
- /如果觉得gcc太麻烦,写一个shell脚本/
hell world程序
int main()
{
return 0;
}
- 可执行程序一执行,就会找一个叫做main的函数然后运行main大括号里面的语句
- 一个.c文件有且只能有一个main的函数
- 如果一个函数碰到return这个单词就代表这个函数运行结束.return后面的语句将永远不会被执行.
- 如果是main函数,他可将前面int省略.return也是可以省略的.
- main(int argc,char *argv[])
include<stdio.h>是一个C语言标准输入输出库.
注释
- //代表单行注释
- /* code/注释多行:注意:/ * /*/ 第一个/ *会遇到第一个 * /匹配
注释使用情况
- 注释代码
- 解释代码
- 写清楚文件名,文件产权copyright,文件制作者,如果是某人:要写清联系方式
printf
- 打印函数:打印双引号""里面的语句,\n:转义字符,代表换行
代码格式
main()
{
}
- 注意:每碰到一个{,就要换行,再来一个tab键.
常量
- 1,2,3,4:整型常量
- 'a','b','c','d':字符常量
- 1.2,2.2:浮点常量
- "hello world":字符串常量
- 0xff1:地址常量
常量的特性
- 常量不会改变
- 常量不能作为左值
- 8,const(只读常量),define(宏常量)
变量
变量的特点
- 可以改变的量
- 可以作为左值,也可以作为右值
变量的定义
- 在shell脚本里:变量名=值
- 在C语言里面:数据类型+变量名;
- 同时定义多个同种类型的变量;数据类型 变量1,变量2;
数据类型
- 整型数据类型:int
- 字符数类型:char
- 浮点类型:float(单精度),double(双精度)
- float类型的变量精确到7位
数据类型的作用
- 标志着后面的变量具体是接收什么类型的值
- 这个变量在内存中占几个字节
- int:4
- char:1
- float:4
- double:8
整型变量
- int value=8;
- int value;value=8;
字符变量
- char ch='c';
- char ch;ch='d';
浮点变量
- float f1=1.2;
- float f1;f1=1.2;
变量的使用
- int value;value=8;
标识符的命名规范
硬性规范
- 不能用数字开头
- 只能由字母,下划线好数字组成
- 不能与C语言关键字相同
建议规范
- 不能用拼音,多查字典
- 尽量使用驼峰命名法:numOfStudent,或者num_of_student
- 见名知义
printf具体用法
int a=6;
float=9.8;
printf("a=%d,b=%f\n",a,b);
- %m.nf
- m<=n+1+整数实际部位的位数,m无效
- m>n+1+整数实际部分的位数,m有效,左边以空格补全
地址
- 内存:字节:Byte是计算机存储的最小单位.
- 1M=1024KB,1KB=1024Byte,1Byte=8bit
- 位:bit:一个字节占八位
- 地址:是每一个字节所对应的编号
进制
- 二进制:0~1:以0B,0b开头
- 八进制:0~7:以0开头:
- 十进制:0~9
- 十六进制:0~ f,或者0~F:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f:0x开头
大端小端存储法
小端法
- 低位上的数存储在低的地址所对应的字节
大端法
- 低位上的数存储在高的地址所对应的字节
- 用处:一般网络传输内的时候
打印特殊字符
- ":\ " printf(""shangqian"\n");
- ':' '或'printf("'shangqian'\n");
- %:%% printf("%%%d\n",a);
- \ :\ \ printf("%d\ \n",a);
字符与ASCII编码
- 字符是一个特殊的整型,占8位
- '\0'=0,' '=32,'0'=48 'A'=65 'a'=97
- 全球unicode
scanf
- 基本用法
#include "stdio.h"
int main()
{
int a;
scanf("%d",&a);
printf("a=%d\n",a);
returnn 0;
}
- 注意点 scanf,后面必须是取变的地址
- 一个变量必须先定义出来再进scanf
- 不要在scanf里多弄花样。
- 同时输入多个变量
scanf("%d%d",&a,&b);
- %d,%f,%c,%lf.%lf是输入double类型的数据
getchar()和putchar()
char ch;
ch=getchar();
putchar(ch);
putchar('\n');
//printf("ch=%c\n",ch);
数据类型转换
- 隐式转换:精度小的===>精度大的
char===>short int===>int===>float===>double- 强制类型转换: (数据类型)变量/常量
int a=9;
int b=8;
float c=(float)a/b;
printf("c=%f\n",c);
运算符
- 注意点:计算机只进行相同类型数据运算,最后算出来的结果也与他们相同的数据类型
2.隐式转换:精度小的===>精度大的
char===>short int===>int===>float===>double
算数运算符
+ - * / % ++
- %:%左右两边的数都是整数
- 后缀++ 前缀++ 前缀-- 后缀--
位运算符
1.|:
3:0011
5:0101
|:为0111 为7
- &:
3:0011
5:0101
&:0001 为1
- ^:
3:0011
5:0101
^ 0110 为6
- ~:按位取反
3:0011
~:1100 为-4
- +7
- 原码:0000 0111
- 反码:0000 0111
- 补码:0000 0111
- -7
- 原码:1000 0111
- 反码:1111 1000
- 补码:1111 1001
- 数据在内存中是以数据的补码形式存在.
- 正数取反
- +7
- 原码: 0000 0000 0000 0000 0000 0000 0000 0111
- 反码:0000 0000 0000 0000 0000 0000 0000 0111
- 补码:0000 0000 0000 0000 0000 0000 0000 0111
- 取反补码:1111 1111 1111 1111 1111 1111 1111 1000
- 反码为:1111 1111 1111 1111 1111 1111 1111 0111
- 原码为:1000 0000 0000 0000 0000 0000 1000
- +7取反为-8
2.-7- 原码: 1000 0000 0000 0000 0000 0000 0000 0111
- 反码:1111 1111 1111 1111 1111 1111 1111 1000
- 补码:1111 1111 1111 1111 1111 1111 1111 1001
- 取反补码为:000 0000 0000 0000 0000 0000 0110
- 反码:000 0000 0000 0000 0000 0000 0110
- 补码:000 0000 0000 0000 0000 0000 0110
- 结果:-7取反为+6
左移
正数左移
- 3左移两位
- 原码:0000 0011
- 反码:0000 0011
- 补码:0000 0011
- 左移两位补码为:0000 1100
- 反码为:0000 1100
- 原码为:0000 1100
- 结果为12
正数右移
- 3右移两位
- 原码为0000 0011
- 反码:0000 0011
- 补码:0000 0011
- 右移两位补码为:0000 0000
负数左移
- -3左移两位
- 原码:1000 0011
- 反码:1111 1100
- 补码:1111 1101
- 左移两位补码为:1111 0100
- 反码为:1111 0011
- 原码为:1000 1100
- 结果为-12
负数右移:以符号位补全
- -3右移两位
- 原码:1000 0011
- 反码:1111 1100
- 补码:1111 1101
- 右移两位补码为:1111 1111
- 反码为:1111 1110
- 原码为:1000 0001
- 结果为-1
- -6右移两位
- 原码:1000 0110
- 反码:1111 1001
- 补码:1111 1010
- 右移两位补码为:1111 1110
- 反码为:1111 1101
- 原码为:1000 0010
- 结果为-2
char:占1个字节
- 表示范围为-128~127
char ch=128;
printf("ch=%d\n",ch);
- 结果为-128
char ch=129;
printf("ch=%d\n",ch);
- 结果为-127
unsigned char
unsigend char a=-1;
printf("a=%d\n",a);
- 结果为:a=255;
- -1的原码:1000 0001
- -1的反码:1111 1110
- -1的补码:1111 1111
- 由于unsigne char 是无符号数,所以不用再回原码,直接取补码;
赋值运算符
num+=i==>num=num+i;
num>>=2==num=num>>2;
计算数据类型所占字节长度
- printf中%p是打印地址
- printf("int所占字节长度=%ld\n",sizeof((num)));
关系运算符
- <, >, >= , <= ,!= , ==
- 在计算当中,关系运算符构成的运算,我们可以看成一个事件,如果这个事件成立,其结果(逻辑结果[0/1])1,如果事件不成立,其结果为0;
逻辑运算符
- 事件1&&事件2:并且,事件1成立并且事件2也成立,整个逻辑结果才为1;否则,整个逻辑结果为0;
- 事件1||事件2:或者,事件1成立或者事件2也成立,整个逻辑结果才为1;否则,整个逻辑结果为0;
- !事件:非,如果事件成立,逻辑结果为1,!1,整个结果为0;否则,逻辑结果为1.
- 进阶:事件1&&事件2:如果事件1不成立,就不会执行&&后面的运算.
- 事件1||事件2:如果事件1成立,就不会执行||后面的运算.
- 5>3&&8<4-!0 >1.
5>3为1,!0为1,4-!0=3,8<3=0,1&&0=0;