1. 一般地源程序文件到可执行程序文件经过如下四步:

预处理 —— 头文件内容插入、宏替换、删注释(#include、#define)

编译 —— 把预处理过的源文件编程汇编文件 *.c -> *.S *.S文件中已经包含机器码和文件格式等

汇编 —— 把汇编程序编程目标代码 *.S -> *.o

链接 —— 把*.o文件和库文件链接到一起,生成可执行程序 *.o + *.so -> *.out

2. 二进制文件与文本文件

所有文件都采用二进制方式记录数字。

如果文件里的所有二进制内容都对应字符,则这种文件叫做文本文件。

除了文本文件以外的所有文件叫做二进制文件。

文本文件可以当做二进制文件使用。

3. 标识符
第一个单词可以是英文单词或者下划线
后面的字符可以是英文单词、下划线或者阿拉伯数字
大小写敏感
标识符的长度没有限制,但是计算机只会截取前面的一部分使用

标识符的书写方式:

驼峰式——XiAn 下划线方式——xi_an

4. 内存、字节、存储区

程序中的所有数字必须记录在内存中;

内存由大量的字节构成,每个字节可以用来记录一个数字,每个字节都有一个编号,不同字节的编号不同。这个编号叫做字节的地址。

内存中所有字节的地址都是从0开始向正数方向增长的;

可以把几个相邻的字节合并成一个整体用来记录一个数字;

一个存储区只能记录一种类型的数字;

存储区也有地址,它的地址是他所包含的所有字节中地址最小的字节的地址;

程序中使用变量代表存储区,程序中对变量的操作就是对它所代表的存储区的操作。

d变量声明语句会让计算机为变量分配存储区。

赋值操作符(=)左边的内容应该可以代表存储区,这种内容叫左值;赋值操作符右边的内容应该可以代表数字,这种内容叫做右值;赋值语句可以把右边的数字放在左边的存储区里。

变量的初始化——在声明变量的时候立即对变量进行赋值。

可以用%p作为占位符把地址数据显示在屏幕上。

5. 数据类型

(1)char

一共包含256(2^8)个不同的整数,每个整数可以代表一个字符。

0 — 127 -128—-1 有符号char

0—255 无符号char

字符和整数之间可以相互替换。

'd' - 'a' == 'D' - 'A' == '3' - '0' == 3 - 0 == 3

转义字符

'\n'		换行
'\r' 回车(让它后面紧挨着的内容出现在本行的最左端,覆盖原有字符)
'\\' 代表字符'\'
'\'' 代表字符'''
... ...
#include <stdio.h>
//将一个小于255的十进制的正整数转换成二进制并打印出来(\r的使用)
void TransToBinary(int Num)
{
printf(" %d\r", Num%2);
Num /= 2;
printf(" %d\r", Num%2);
Num /= 2;
printf(" %d\r", Num%2);
Num /= 2;
printf(" %d\r", Num%2);
Num /= 2;
printf(" %d\r", Num%2);
Num /= 2;
printf(" %d\r", Num%2);
Num /= 2;
printf(" %d\r", Num%2);
Num /= 2;
printf("%d\n", Num%2);
return;
}
int main(int argc, char **argv)
{
int num = atoi(*(argv+1));
TransToBinary(num);
return 0;
}
[root@localhost 0623]# vim transTobinary.c
[root@localhost 0623]# gcc transTobinary.c
[root@localhost 0623]# ./a.out 10
00001010
[root@localhost 0623]# ./a.out 255
11111111

(2)整数

程序中不带小数点的数字默认是整数类型;

如果在不带小数点的数字后面加上u表示这个数字类型是无符号整数类型。

(3)浮点型

程序中带小数点的数字默认是双精度浮点型;

如果在小数点后面加上f表示这个数字的类型是单精度浮点型。

(4)布尔类型

C99规范中引入了布尔类型。

(5)数据类型和占位符的对应关系

char/unsigned char				%c
short %hd
unsigned short %hu
long %ld
unsigned long %lu
int %d(十进制)%o(八进制) %x(十六进制)
unsigned int %u
float %f 或者 %g
double %lf 或者 %lg
指针类型保存的地址(*) %p
char* 保存的字符串 %c

(6)不同数据类型的存储区在内存里包含的字节个数不同。

char/unsigned char					1个字节
short/unsigned short 2个字节
int/unsigned int 4个字节
long/unsigned long 4个字节
float 4个字节
double 8个字节

(7)sizeof

sizeof关键词后面的小括号里面可以写任意能当数字使用的内容。

sizeof小括号里如果修改了任何存储区的内容,这个修改不会真正发生。例如:sizeof(num=10);不会使num的值编程10。

6. scanf 语句

可以在一条语句里获得多个数字并记录到不同的存储区里。例如 scanf("%d %d", &num1, &num2)。

如果用户输入的格式和程序希望的格式不同,程序可能无法再获取后面的数字。

7. 二进制

(1)任何一个数字既可以用十进制方式表示,也可以用二进制方式表示。

(2)非负数二进制与十进制的转换

二进制的非负数 ——> 十进制的非负数
0000 1010 = 2^3 + 2^1 = 8 + 2 = 10
十进制的非负数 ——> 二进制的非负数
除2取余法 示例见上文转义字符

(3)负数的二进制和十进制之间是不能直接转换的,需要借助该负数的相反数(即对应的正数)

转换过程分为三步:
计算相反数
根据相反数进行计算
根据转换结果再计算相反数

把二进制数字中每个数位内容变成相反数字(0/1),然后再加1,就得到了该二进制数的二进制相反数。

有符号类型最左边的二进制数位叫符号位,符号位是0表示非负数,符号位是1表示负数,符号位能帮助我们判断符号,但它并不是符号。

当把占地大的整数赋值给占地小的整数类型存储区时,只能保留最后的二进制数位,这会导致数据丢失;当把占地小的有符号整数类型数字赋值给占地大的整数类型存储时,扩展的所有二进制数位上都填充符号位,这样可以保证符号位不变。

(4)十六进制和八进制都可以看做是二进制的简写方式。
8. 运算符

(1)如果参与除法(/)计算的两个数字都是整数,结果只会保留整数部分。

(2)赋值语句可以当做数字使用,这个数字就是赋值语句完成后存储区里的数字。

(3)可以在一条语句里使用多个赋值操作符,这个时候先计算右边的,后计算左边的。

(4)符合赋值操作符的优先级和赋值操作符的优先级一样低。例如:n* = 2 + 3; 先计算加法,再乘等。

(5)不要在一条语句里对同样一个变量多次进行自增或者自减计算。

(6)“与”(&&)和“或”(||)都具有短路特性

如果前一个逻辑表达式的结果可以决定整个逻辑表达式的结果,则后一个逻辑表达式将被忽略。

0 && num++;       //后面的自加不会运算
1 || num++; //后面的自加不会运算,num的值不变

(7)位操作符——对二进制数进行操作

~			取法操作符		0变1,1变0
& 按位与 两个位都为1时,结果才为1
| 按位或 两个位都为0时,结果才为0
^ 按位异或 两个位相同为0,相异为1
<< 按位左移 各二进位全部左移若干位,高位丢弃,低位补0
>> 按位右移 各二进位全部右移若干位,对无符号数,高位补0

例如,位操作符简单使用

ch ^ 0010 0000				变换大小写
num & 1 == 1 为真表示num为奇数,否则为偶数
0000 0011 3
0000 0011 3 << 2
0000 1100 12

左移时右边空出来的位置一定填充0。

有符号类型整数右移后左边空出来的位置一定填充符号位;无符号类型整数右移后左边空出来的位置一定填充0。

一般情况下,数字向左移动n位,相当于乘以2的n次方;数字向右一定n位,相当于除以2的n次方。

所有位操作符不会修改存储区内容,而只会得到一个新数字(类似加减乘除)。

三目操作符中,不要在问号后面写赋值操作符。

#include<stdio.h>
//将一个小于255的十进制的正整数转换成二进制并打印出来(位运算符的使用)
void TransToBinaryByBit(int num)
{
unsigned char ch = 0x80;
int i = 0;
for(i=0; i<7; i++)
{
printf("%d", (num & ch) != 0);
ch >>= 1;
if(3 == i)
{
printf(" ");
}
}
printf("%d\n", (num & ch) != 0);
}
int main(int argc, char** argv)
{
int num = atoi(*(argv+1));
printf("num = %d\n", num);
TransToBinaryByBit(num);
return 0;
}
[root@localhost 0624]# vim TransToBinaryByBit.c
[root@localhost 0624]# gcc TransToBinaryByBit.c
[root@localhost 0624]# ./a.out 10
num = 10
0000 1010
[root@localhost 0624]# ./a.out 255
num = 255
1111 1111
9. 类型转换

(1)不同类型的数出现在一条表达式中时,发生强制类型转换。例如:-7 + 3u > 0 的结果是1。

(2)类型转换不会修改任何存储区的内容,计算机会分配一个新的存储区,把转换后的结果记录在新的存储区里。然后用这个新的存储区进行后面的计算。

(3)赋值运算符(=),从右向左执行,例如:num = ch = 300;

(4)逻辑运算符(>、<、==、!=)从左向右执行,例如:3 < 7 < 5; 结果为真,返回1。

10. 流程控制

(1)if分支中的逻辑表达式有先后顺序,如果前分支的逻辑表达式为真,就忽略后面分支的逻辑表达式,可以利用这一点简化后面的逻辑表达式。

(2)if分支里的逻辑表达式可能是不完整的,必须结合前面的所有逻辑表达式一起理解。

(3)如果for循环正常结束,则循环变量一定落在指定的数字范围之外。

(4)如果循环采用break语句结束,则循环结束后循环变量一定落在指定的数字范围之外。

(5)for循环可能不执行大括号里面的语句(一开始循环条件就不成立)。

(6)for循环中,小括号中最前面的部分和最后面的部分可以用逗号连接多条语句,但是中间的语句必须是逻辑表达式。

(7)所有的死循环都必须使用break语句结束。

(8)使用for循环打印图案

54321
5432
543
54
5
#include <stdio.h>
void PrintByFor()
{
int i = 0;
for(i=54321; i>=5; i /= 10)
{
printf("%d\n", i);
}
}
int main()
{
PrintByFor();
return 0;
}
[root@localhost 0624]# vim PrintByfor.c
[root@localhost 0624]# gcc PrintByfor.c
[root@localhost 0624]# ./a.out
54321
5432
543
54
5

(10)将一个十进制数字转换成二进制

#include <stdio.h>
void TransToBinaryByFor(int num)
{
unsigned char ch = 0x0;
for(ch=0x80; ch>=1; ch>>=1)
{
printf("%d", (num & ch)!= 0);
if(ch == 0x10)
{
printf(" ");
}
}
printf("\n");
}
int main(int argc, char** argv)
{
int num = atoi(*(argv+1));
TransToBinaryByFor(num);
return 0;
}
[root@localhost 0624]# vim TransToBinaryByFor.c
[root@localhost 0624]# gcc TransToBinaryByFor.c
[root@localhost 0624]# ./a.out 10
0000 1010

第一本C语言笔记(上)的更多相关文章

  1. 第一本C语言笔记(下)

    11. 数组 (1)数组初始化时,如果初始化数字个数超过存储区个数,就忽略多余数字.如果初始化数字个数少于存储区个数,则后面的存储区自动被初始化为0. (2)数组名称可以代表数组里第一个存储区的地址. ...

  2. 011-指针(上)-C语言笔记

    011-指针(上)-C语言笔记 学习目标 1.[掌握]字符串常用函数 2.[掌握]指针变量的声明 3.[掌握]指针变量的初始化 4.[掌握]函数与指针 5.[掌握]指针的数据类型 6.[掌握]多级指针 ...

  3. 005-循环结构(上)-C语言笔记

    005-循环结构(上)-C语言笔记 学习目标 1.[掌握]switch-case结构 2.[理解]case语句穿透 3.[理解]Xcode断点调试 4.[理解]while循环结构初体验 5.[掌握]w ...

  4. 瘋耔java语言笔记

    一◐ java概述                                                                                        1.1 ...

  5. R语言笔记

    R语言笔记 学习R语言对我来说有好几个地方需要注意的,我觉得这样的经验也适用于学习其他的新的语言. 语言的目标 我理解语言的目标就是这个语言是用来做什么的,为什么样的任务服务的,也就是设计这个语言的动 ...

  6. Scala语言笔记 - 第一篇

    目录 Scala语言笔记 - 第一篇 1 基本类型和循环的使用 2 String相关 3 模式匹配相关 4 class相关 5 函数调用相关 Scala语言笔记 - 第一篇 ​ 最近研究了下scala ...

  7. Go 语言笔记

    Go 语言笔记 基本概念 综述 Go 语言将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡. 设计者通过 goroutine 这种轻量级线程的概念来实现这个目标,然后通过 ch ...

  8. 013-结构体-C语言笔记

    013-结构体-C语言笔记 学习目录 1.[掌握]返回指针的函数 2.[掌握]指向函数的指针 3.[掌握]结构体的声明 4.[掌握]结构体与数组 5.[掌握]结构体与指针 6.[掌握]结构体的嵌套 7 ...

  9. 004-流程控制-C语言笔记

    004-流程控制-C语言笔记 学习目标 1.[掌握]关系运算符和关系表达式 2.[掌握]逻辑运算符和逻辑表达式 3.[掌握]运算符的优先级和结合性 4.[掌握]if-else if-else结构的使用 ...

随机推荐

  1. CC10:访问单个节点的删除

    题目 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点. 给定待删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true 解法 这道题并不难,主要是题目中这句话确定 ...

  2. Java8中的新特性Optional

    Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象.Optional 是个容器:它可以保存类型T的值,或者仅仅保存 ...

  3. 机器学习框架ML.NET学习笔记【7】人物图片颜值判断

    一.概述 这次要解决的问题是输入一张照片,输出人物的颜值数据. 学习样本来源于华南理工大学发布的SCUT-FBP5500数据集,数据集包括 5500 人,每人按颜值魅力打分,分值在 1 到 5 分之间 ...

  4. 01SpringBase

    Spring (容器) 概述: 01.Java EE开发者的春天 02.主要目的是 降低业务逻辑层和其他层的耦合度 IOC 03.spring容器是用来创建(new)和管理(对象之间的关系)程序中所有 ...

  5. java实现xml文件读取并保存到对象

    首先浅聊一下解析xml的四种方式: 1.DOM方式:有缺点但是这个缺点却也是他的优点.下面详细介绍: 以树形的层次结构组织节点或信息片断集合,可以获得同一个文档中的多处不同数据.使用起来简单. 优点是 ...

  6. Jquery each跳出循环

    Jquery each跳出循环break--return false--跳出所有循环continue--return true--跳出当前循环

  7. ECShop怎么首页调用文章列表

    举例如首页调用方法:1.先打开index.php文件找到以下代码:$smarty->assign('new_articles', index_get_new_articles()); // 最新 ...

  8. Ubuntu 12.04源

    deb http://ubuntu.uestc.edu.cn/ubuntu/ precise main restricted universe multiverse deb http://ubuntu ...

  9. SaaS 系统架构设计经验总结

    2B SaaS系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk SaaS系统.很多SaaS创业公司也拿了大额风投.毕竟SaaS相对传统软件的优势非常明显. ...

  10. 洛谷 P1074 靶形数独

    题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的 ...