一、写第一个C语言程序,并分步编译
#include <stdio.h>
int main(int argc,const char *argv[])
{
printf("Hello world!\n");
return 0;
}
gcc -E hello.c -o hello.i //预处理
gcc -S hello.i -o hello.s //编译
gcc -c hello.s -o hello.o //汇编
gcc hello.o -o hello //链接
二、宏定义的注意事项
1.在程序中,所有遇到宏名的位置都被替换成宏体
2.宏定义只是简单的替换
3.作为字符串输出需有" "
4.#可把带参宏的参数转成字符串
5.存在宏体与参数无关情况
6.宏定义后无;
7.带参宏,宏名与参数的括号之间不能加空格
8.宏定义替换时,不检查语法错误
9.宏名一般大小,带参宏的参数不需要大写
10.宏定义一般放在主函数上方,头文件下方
三、宏定义的练习
1.有如下宏定义
#define N 10
#define M N+2
#define NUM M*N+M/4
求NUM的结果
NUM = 10 +2*10 +10 +2/4 = 40
2、有如下宏定义
#define M 10
#define N M+7
#define NUM M+N*N/M+7
NUM = 10+10+7*10 +7/10 +7 = 97
3、使用带参宏实现,两数相加和两数相减
#include <stdio.h>
#define ADD(a,b) a+b //带参宏实现两数想加
#define SUB(a,b) a-b //带参宏实现两数相减
int main(int argc, const char *argv[])
{
//带参宏仍然是宏名替换宏体的过程
printf("%d\n",ADD(2,3));
printf("%d\n",SUB(3,4));
return 0;
}
5
-1
四、变量和scanf相关内容
1.变量
(1)格式:存储类型 数据类型 变量名;
(2)13个基本数据类型:int double float char long short enum typedef union struct signed unsigned void;
(3)要求:变量名是一个标识符,由字母、数字和下划线构成,不能以数字开头,严格区分大小写,不能与关键字同名;
(4)存储类型:
auto 自动类型(默认),局部变量默认是自动类型,全局变量是非自动类型
static 静态存储类型
register 寄存器类型
extern 从其他文件中找
volatile 从内存中找
const 常量
(5)显式的强制类型转换:
格式:(强转之后的类型)变量名;
小的数据类型向大的数据类型强转是安全的,大的数据类型向小的数据类型强转是不安全的;
(6)原码、反码和补码:
正数 原反补是一样的,
负数 最高位为1,反码是原码除符号位之外其他位取反,补码是反码+1。
2.scanf
scanf(“占位符”,占位符对应的数据类型的变量的地址);
sacnf,一次只能识别到空格,tab键和\n之前,是严格控制格式的函数,双引号内的格式是什么,输入的格式就是什么。
char a,b,c,d;
scanf("%c,%c,%c,%c",&a,&b,&c,&d);
printf("%c\t%c\t%c\t%c\t",a,b,c,d);
scanf吸收垃圾字符的三种方式
//第一种方式,用getchar吸收
scanf("%c",&a);
getchar();
//第二种方法,在%c前面家空格。
scanf(" %c",&a);
putchar(a);
//第三种办法,利用scanf严格控制格式的特点。
scanf("%c ",&a);
五、进制转换
0111 1100 | 转十进制 | 124 |
---|---|---|
93 | 转二进制 | 0101 1101 |
153 | 转十六进制 | 0x99 |
1010 0001 | 转八进制 | 241 |
1011 1000 | 转十六进制 | 0xb8 |