c语言
1.c语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
2.编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。可以独立编译单独的模块,稍后用链接器合并已编译的模块。IDE(集成开发环境)。
3.常量与符号常量:
符号常量:#define 标识符 常量
#define PRICE 30, 编译前,预处理将出现的PRICE都替换为30
范围:
int型变量的范围是 -2147483648~2147483647
unsigned int型变量的范围是0~4294967295
unsigned int取值范围0到4294967295(32位),0到65535(16位)
short int
unsigned short int
long int
unsigned long int
注意数据溢出问题
数据类型
float 占 32位:1个符号位,24个有效数字、非指数位,7个指数位 (c primer plus 6 p56)
double 通常占64位 : 至少能表示10位有效数字
字符型:char a = ‘a’;
c语言将字符常量视为int类型而非char类型,‘A’
打印字符:%c
字符串常量
以空字符结尾的char类型数组
结尾:\0
字符串常量(“hello world") 属于静态存储类别
几种声明方式:
char string[20] ; //20个连续的储存单元,可以存放19个字符,最后一个留给空字符’\0‘
const char *str1 = “hello world”;
char a;
scanf(“%c”, &a);
scanf(“%s”, string);
转义字符
进制表示
c显示进制:( %d 十进制 )( %o %#o 八进制 ) ( %x %#x %#X 十进制 )
一些常见标识符、关键字
const: 若放在*左侧任意位置,限定了指针指向的数据不能改变, 放在右侧,限定了指针本身不能改变
typedef:
_Generic
_Noreturn
_Static_assert
一些常见函数
getchar(),让程序等待一次击键
puts(str);//只打印字符串,并且末尾加上换行符
scanf(“%1f“, &temp); //读取的输入结尾是EOF (-1)
printf(”%1f", temp);
{ //一些打印输出结果:(修饰符、标记:-未在此处说明)
%a 浮点数,十六进制,p计数法
%A
%c 单个字符
%d 有符号十进制整数
%e 浮点数,e计数法
%E
%f 浮点数,十进制计数法
%g 根据值的不同,自动选择%f或%e,%e格式用于指数小于-4或者大于或等于精度时
%G
%i 同%d
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 无符号十六进制整数
%X
%% 打印一个%
}
sizeof():以字节为单位给出指定类型的大小 ,c99和c11规定用%zd来接收,若编译器不支持,可以用%u或%lu
strlen() : 用%zd来接收
putchar():输出单个字符
c预处理器和c库
#define、#include、#ifdef、#if、#elif、#line、#else、#endif、#ifndef、#error、#pragma
#define LIMIT 30
创建条件编译
预处理器无法识别{
}, 所以需要来标记指令块,也可以嵌套
#ifdef MAVIS
#include "/u/p.h"
#define STA 5
#else
#include "/u/w.h"
#undef LIMIT
#endif
#ifndef 指令判断后面的标识符是否是未定义的,通常用来定义之前未定义的常量
#define LIMIT 20
#endif
泛型选择(C11)
c11新增了泛型选择表达式:
一些头文件库
<string.h>
strlen():
<stdio.h> :标准输入输出头文件
<ctype.h>: 字符函数相关头文件
<stdbool.h> :bool 代替_Bool
宏定义
1.通过宏定义进行注释,而非嵌套注释:
命名
小写、大写、数字、下划线,第一个字符不能是数字
类型转换
无论是自动还是强制类型转换,都是在当条语句的结果有效(int)(x+y)
算术运算符
逻辑运算符
与 、或、 非
&&
||
!
异或、
具体见本文末 位运算
条件运算符 ?:
x = ( y < 0 ) ? -y : y;
函数
使用函数之前,要声明函数原