c基础知识

day1
一、概述
1、课程介绍:
c语言->OC语言(Objective-C)->UI->网络->项目(AppStore)
2、C
(1)很多语言的基础 (C、C++、Java
(2)锻炼编程能力
(3)逻辑能力
(4)为OC做铺垫
3、答疑时间17:00~18~00 603
二、Mac及OS X介绍
1、Mac是Macintosh的缩写
2、Os X 是第10个版本
3、Os X类Unix操作系统
清屏clear
4、Finder的配置(根据自己的喜好配置)
5、Doc的使用(根据一些常用程序在Doc上)

6、Safari浏览器(共享:lyx.local/1512-share)

软件共享smb://10.8.13.1

三、快捷键
1、commad + tab:不同应用程序直接切换
2、command + n:新建光标所在应用程序的新程序
3、command + w:关闭光标所在应用程序
4、command + q:(quit)关闭光标所在的所有的同一类得应用程序
5、command + c/v/x/z拷贝/黏贴/剪切/撤销
6、command +`:切换同一类型应用程序的不同窗口
7、command+f:查找
四、
1、command+ +/-:放大/缩小
Unix目录结构:
(1)以根目录(总目录)开头,后面加上子目录,子目录下还有子目录,各个子目录之间用/分割:
/Application/Messages.app
(3)绝对路径:以根目录开头的路径
(4)相对路径:有参考的路径
(5)当前路径:简记 . ./s.app执行当前目录文件

命令:
(1)pwd(print working directory):显示当前目录名称
(2)cd (change directory):切换目录
cd $home /cd/cd ~进入家目录
(3)list:列出当前目录下的文件和目录
ls -l:以列表显示某个目录或文件的详细信息
ls -a: 显示隐藏的目录或文件
ls -al:
(4)cp(copy):源(目录或文件)+目标(目录或文件) 文件-文件,同一目录下可以有相同名文件
如果源是目录,此时需要加-r 例如 cp -r day01 ../
(5)mkdir(make directory):创建一个目录后加目录名

(6)touch :创建文件+文件名
(7)mv:例mv 2.c 3.c 移动文件 、把目标改名
(8)rm(remove):删除某个目录或文件,如果为目录时需要加-r(redirectory目录,删除提示是否删除) -f(不用提示)

3、VIM
(1)正常(命令)模式:使用vim打开文件时的模式,可以输入命令
(2)编辑模式(插入模式):可以修改文件内容
(3)视图(可视)模式:可视化地批量修改文件内容的格式
(4)命令模式:命令是可见的,常用与:和/开头的命令。例如保存,退出,查找等

切换模式esc
打开一个文件:vi+文件名(文件名不存在则创建)
退出一个文件:(1)esc:wq 保存退出
(2)esc:q 不保存退出
(3)esc:q!强制不保存退出
进入编辑模式:esc i/a(在前面/后面添加)
正常模式的命令
(1)yy:复制光标所在行
(2)p:粘贴到光标所在下一行
(3)nyy:复制光标所在的向下n行
(4)dd:剪切
(5)u:撤销刚才的操作
(6)ctrl(control)+r:反撤销(撤销之后才能做的)
(7)x:删除单个字符
(8)光标定位:
shift+4:进入行尾
shift+6:进入行首
G:进入尾行
gg:进入首行
ngg:定位到第n行(:n)
(9)cat 1.c:查看文件内容
4、gcc(C编译器)的使用
作用:将高级语言编写的代码翻译成机器代码(二进制)
版本:gcc -v
编译:(1)gcc hello.c//默认生成可执行程序a.out
(2)gcc hello.c -o hello //生成hello(目标文件.o文件(加入库函数),不是.out二进制文件)可执行程序(二进制文件)
hello是文件名,和a.out都是二进制文件,都可直接执行
(3)gcc -o hello hello.c //生成可执行文件
编译过程:源文件->目标文件(编译生成目标文件,.o文件,包含进库函数)->链接(从库里链接具体方法,不出错就会生成可执行文件)->生成可执行文件
gcc编译错误:xcrun:error:active developer path…
解决方法:在中端执行下面的命令
sudo xcode-select -switch /Applications/Xcode.app/contents/Developer

作业:
1、写一个程序,要求第一行输入5个,第二行输入hello,world,第三行输出5个


hello,world


二进制文件不一定是.out结尾
5进制转换
(1)二进制:
十进制->二进制:
除取余,余数倒序写
计算过程:第一次用原数除于2,后面每次用商作为被除数,继续除以2,直到商为0,将每次求得的余数倒序写,就得到二进制数。
八进制->二进制:三位二进制=一位二进制

正数
负数
(1)原码(符号位不参与运算)
正数:符号位为0
负数:符号位为1
(2)反码(符号位不参与运算)
正数:与原码一样
负数:符号位不变,其余位按位取反(0变成1,1变成0)
(3)补码(符号位参与运算)是为了实现减法
正数:与原码和反码相同
负数:反码加1

为什么使用补码来存储?
(1)可以将减法变成加法运算,简化软件设计。
(2)符号位参与了运算,无需单独考虑符号位。溢出(正常情况溢出)。

【结论】计算机内部是采用补码的方式存储整数。
计算机内存中的所有数据都是以补码方式来存储的?
不正确。

day2
1、常量
常量:程序运行过程中,其值不能改变。
变量:程序运行过程中,其值可以改变。(目的节省内存空间)
2、标识(zhi)符(变量的名称,一串字符或单个字符)ID
(1)只能以数字(0~9),字母(a~Z),下划线(_)组成。
(2)首字母不能使数字。
(3)不能是C的关键字(编辑器中有颜色),保留字。
(4)区分大小写。
int ab_;是指示符。
3、变量的声明(declaration)
类型名 变量名(符合标示符要求);
int a;//声明一个整型变量,分配一块内存空间(4字节)
//这块内存空间的值不确定
printf(“%d\n”,a);

对变量赋值
变量名=(赋值运算符) 变量对应的类型的值;
对变量初始化 变量名(符合标示符要求) = 变量对应的类型值;
【注意】
1、变量声明的时候没有赋初值,其值不确定
2、对变量可以重复赋值,最终的值以最后一次赋值为准
3、必须先声明再使用。
4、变量的类型
(1)整型
int 4个字节 16位机下两个字节
short(int) 2个字节
long(int) 32位机 4个字节 64位 8个字节
long long 超长整形 8个字节

每种整型变量都对应一个无符号版本(unsigned)
无符号打印,使用%u
【截断】长的整型赋值给短的整型,发生截断,保留低位,截去高位
int a = 8;
short b = a;
【位截断】短的整型赋值给长的整型,发生扩展,正数补0,负数补1是补在高位(将原来的符号位移位),其余的扩展的位补0。?
short a =9;
int b = a;
(2)字符型
unsigned char 一个字节
man ascii:查看ascii码表

计算机内存中以什么形式存储字符型?
补码还是ascii码?
答:ascii码

声明并对字符赋初值
初始化:声明同时赋值。
int a =97;
char ch1 = a;
ch1 = ‘b’;
字符型常量:
257(字符型常量最大不能超过255)
‘\n’
‘\0’
‘0’
‘a’
(3)浮点型
IEEE754(国际电气电子工程学会) (使用科学计数法)
double 双精 度8个字节 有效数字13~15位(近似值,不能确定)
float 单精度4个字节 有效数字 6~8位 (近似值,不能确定)
输出时时候,不看怎么存,只看怎么读取
浮点型的输出
float f1 = 5.23;
5 double d1 =f1;
6 printf(“%.2f\n”,f1);
7 printf(“%lf\n”,d1);
5、读取和打印变量的值
(1)读取
int a =0;
scanf(“%d”,&a);//%d格式控制符
(2)输出
printf函数
格式化控制符:
%d十进制正数
%x十六进制整数
%o八进制整数
%c字符型
%f浮点型(单精度)
%lf浮点型(双精度)
%lu无符号长整型整数
%u无符号10进制整型
%s字符串(指针或者字符数组表示)
%p 打印地址,

\n 换行
\t 制表符(一般四个空格)
6、运算符和表达式
运算符:用于执行程序代码的运算。
表达式:由数字、运算符、数字分组符号(括号等)组合起来。

(1)赋值运算符

将=右边的值赋值给左边变量
55=68;//不正确,左边必须是变量
本质:修改指定名称的存储空间的内容
a=68;
(2)算术运算符
+ -* / %
1.0/2; 隐式/自动类型转换
强制类型转换
(1)形式:(类型)表达式
double d = 5.0;
int a = (int)d;//d的类型和值不变
(2)本质:只是临时改变表达式中变量的类型,作为赋值使用,表达式中变量的类型 .没有改变。
a++;//a=a+1;
a—;//a=a-1;
b=a++;//先把a的值赋值给b,然后再自增
b=++a;//a先自增,然后将自增的结果赋值给b
【注】算术运算符的运算结果是一个确定的值
(3)关系运算符

< >= <= ==(判等) !=
关系运算之后得出的结果(值):
1:真(true)
0:假(false)
(4)逻辑运算符
运算时,以0为参考, 非零值为真
逻辑与: a&&b
两个同时为真,结果就为真,如果有一个是假,结果就为假。
-1&&1 结果为1
0&&1 结果为0
逻辑或:表达式1||表达式2
逻辑非:!表达式
int a=5;
!a;结果为0(假)
scanf(“%c%c”,&d,&f);输入字符时不用空格隔开,空格/换行也是字符,输入数字时才用空格隔开
(5)条件表达式
表达式1?表达式2:表达式3
表达式1的值是真/假
计算出表达式1的值,然后如果是真的话,将表达式2作为整个条件表达式的值,否则将表达式3的值作为整个条件表达式的值。

练习:
1、利用条件表达式判断x和y(都为整数类型),找出两个数的最小值,将最小值输出,要求x和y的赋值还是使用scanf来操作。
输入5 6输出5.

(6)逗号表达式
表达式1,表达式2
先计算表达式1的值,然后计算表达式2的值,将表达式2的值作为整个逗号表达式的值。
3+5,6+8 整个表达式的值为14
a=5,b=7 整个表达式的值为7
7、运算符的优先级和结合性
优先级:算术>关系>逻辑>条件>赋值>逗号
实际编程过程中通过加括号来控制优先级和结合性

三大结构:
1、顺序结构:按照顺序依次执行
2、分支结构:需要判断表达式的真假,如果真得话进入相应的分支,如果假的话,进入其他分支。
3、循环结构:减少程序员对于重复性的操作的处理,将操作性的操作集中起来管理。

分支结构:
1、if
(1)if(表达式)
{
语句块(多条语句);
}
如果表达式为真的话,执行语句块;否者,继续顺序执行下面的语句。
;//空语句
(2)if-else
if(表达式)
{
语句块1;
}
else
{
语句块2;
}

从键盘输入两个整数,输出其中大得数(不能使用条件表达式)。
(3)if-else if-else
        if(表达式1)
{
    语句块1;
}
else if(表达式2)
{
    语句块2;
}
else if(表达式3)
{
    语句块3
}
…
else if(表达式n-1)
{
    语句块n-1;
}
else
{
    语句块n;
}
如果表达式1的值为真,执行语句块1;否认,判断表达式2的值,如果表达式2的值为真,执行语句块2;否则,执行语句块3.

练习:任意在键盘输入一个字符,然后,如果是数字,打印“这是一个数字”,如果是一个大写,打印“这是一个大写字母”,如果是一个小写字母,打印“这是一个小写字母”,如果是其他字符,打印“这是其他字符”。
char a;
if(ch<=‘9’&&ch>=‘0’)或if(ch<=57&&ch>=48)

day03

分支结构:
1、switch case
switch(表达式){
case 常量表达式:
语句块;

case 常量表达式:
语句块;
default:
语句块;
}
【注】
1、switch(表达式),表达式必须是整型
2、case 后必须跟着常量表达式,n+10不是常量表达式
3、case1:
语句1;
case2:
语句2;
不允许有重复的分支标号
4、首先计算表达式的值,然后与case后面的那个常量表达式进行判等操作,如果相等,就进入后面的语句块执行,如果所有的常量表达式判等都失败,则进入default后的语句执行块。上面的过程,如果语句块之后没有break语句,则会继续执行后面的分支标号。
5、default相当于一个普通分支,无论放在哪里所有情况不符合则会运行,可有可无,有的话跟位置没有关系,放在前面必须加break,放在后面可以不加break.

int a=5;
switch(a)
{
case 1:
;
default:
printf(default);
case 5:
printf(“5”);
break;
case 6:
printf(“6”);
default:

    printf(“default”);

}

break语句能否使用在if语句中?
答:不能
使用ABCDE来表示成绩,从键盘输入一个A~E的一个值,然后根据下面的要求来输出
如果输入A:输出90~100
如果输入B:输出80~89
如果输入C:输出70~79
如果输入D:输出60~69
如果输入E:输出0~59
如果输入其他字符,输出ERROR

循环结构
1、for
{
语句块;
}
for(表达式1;表达式2;表达式3)
执行流程:首先执行表达式1,然后判断表达式2的真假,如果表达式2的值为真,就执行语句块,再执行表达式3,然后返回继续判断表达式2的值,如果表达式2的值为真,继续执行语句块,然后又执行表达式3,直到表达式2为假,跳出循环。

变形1:
int a;
a=5,b=3;
for(;表达式2;表达式3)
(1)省略的表达式是赋值表达式,可以放在for语句之前
(2)表达式1中可以是多个表达式,用逗号隔开-

变形2:
()for(表达式1;表达式2;)
{
语句块;
表达式3
}
(1)表达式3可以省略,但要放在语句块之后
(2)表达式3也可以是多个表达式,用逗号隔开
例:for(int i=1;++i<4;)表达式3放在表达式2中,执行了2次

变形3:
for(表达式1;;表达式3)
{
语句块;
}
(1)省略表达式2,就是说表达式2永远为真,其实就是死循环
(2)可以使用break来跳出循环

练习:
1、输入一个整数n,输出从1到n的所有数字。
2、打印26个小写字母

day04

1、嵌套循环
for(表达式1;表达式2;表达式3)
{
//外层循环体
for(表达式4;表达式5;表达式6)
{
//内层循环体
}
}

例子:
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
;
}
}
打印图形:
(1)行:外层循环控制有多少行
(2)列:内层循环控制有多少列

练习:1、输入一个整数n,输出n行n列的每个字符为*的矩阵图形
3行3列




for循环设计要点
1、多重循环,将长循环放在内层,将短循环放在外层,减少循环切换的时间,提高性能。
2、尽量不要在循环体里面修改循环变量,如果真需要,可以放在循环体最后面。

2、while循环
while(表达式)
{
循环体语句;
}
首先判断表达式真假,如果为真,执行循环体语句块;然后继续判断表达式的值的真假,如果为真的话继续执行循环体语句块,直到表达式的值为假,才跳出循环。

while(!a)//等价于while(a==0)
break使用在for循环while循环switch-case语句,不可以使用在if-else中。//跳出整个循环
continue//跳出本次循环

3、do while
格式:

do
{
    语句块;
}while(表达式);
执行过程:先执行语句块,然后再判断表达式的值,若谷表达式的值为真,继续执行语句块,直到表达式的值为假,退出整个循环。
do-while至少执行一次。

例子:
int x=1;
do
{
x=-1*X;//x=-1;
}while(-x);//!(-1)假循环一次

int x=3;
do
{
printf(“%d”,x-=2);
}while(!(- -x));循环两次

for(int k=0;k=0,k=1;k++)
{
;
}

4、数组
具有相同数据类型的集合
一次性存储多个数据
连续存储,访问简便。
(1)数组的声明:
类型 数组名 [元素个数];
数组名是常量还是变量?
答:常量。
只声明数组,其值还是不确定。
int a[10];//盖着a可以看到类型。具有10个元素,每个元素的类型是整数,是一个复合类型,a是数组名。
数组声明时,数组元素的长度是常量表达式,不能是变量。
int n=10;
int b[n];//编译通过,这样声明不对,但是mac系统编译器未遵从c标准
int b[n]={1,2,3};//编译不通过
(2)数组的大小:
sizeof(a);//单位是字节数
sizeof 是一个关键字,也是一个运算符
数组元素个数=sizeof(数组名)/sizeof(类型)
变量的类型:
(1)存储数据时使用的内存大小
(2)存储数据时使用数据类型
(3)数组的初始化
int a[10]={1,2,3,4,5,6,7,8,9,10};//完全初始化
int a[] = {1,2,3,4,5,6,7,8,9,10};完全初始化时,可以省略数组下标
int b[10]={1,2,3};//不完全初始化,未初始化的都是0
int c[10]={};对数组清零
(4)数组的赋值
int a[10];
(5)数组的下标
数组的下标范围不能越界,如果这个数组有n个元素,

day5

1、字符数组
(1)初始化
char ch[10]={0};//字符清空初始化
char ch2[10]={‘\0’};//字符清空初始化

ch2[4]=“E”;错误,//“E”是字符串常量,占用两个字节,有一个隐含的’\0’(字符串结束标志)
char ch4[5]=“E”;//正确,”E”是字符串常量,占两个字节,有一个隐含的’\0’(字符串的结束标志)
char ch5[5]={‘E’,’\0’};
char ch[]=“abc”;
char ch7[5]=“ABCD”;
ch7[4]=‘\0’;

include

include

include “1.h”//先在当前路径下找,如果找不到,再去系统默认路径下去找。

一般情况下,在头文件中包含:函数声明,全局变量的声明,结构体,宏定义。

处理过程:将头文件的所有的内容完全展开,如果这个头文件还包含其他头文件,则继续展开,直到所有头文件都全部展开。
三、宏定义
1、用简单容易记忆的名字代表特定的内容
格式:#define 名称 内容
处理:简单地完全替换

define MAX(a,b) a>b?a:b

int max = MAX(5,6);//可以,不是传参,是替换,参数没有类型
练习:
写一个宏,输入n,输出(n+1)^2的值
【注意】
1、带参数的宏,若参数需要参加运算,则参数需要添加括号
2、若整个宏有值,则需要整体添加括号
IsDigit(x) ((x)>=‘0’&&(x)<=‘9’)

宏和函数的区别(面试常考):
1、宏是编译时的概念,函数是运行时的概念
2、宏运行速度比较快,函数运行速度比较慢。
3、宏不会对参数进行类型检查,函数会有严格的类型检查。
4、宏不会分配内存单元,函数要分配内存单元。
5、宏会使代码体积变大,而函数不会。
6、宏不会自己调用自己,函数可以。
练习:用宏定义IsDigit(x),表示一个字符是否是数字字符

内置宏://打印日志使用
printf(“%s\n”,FILE);//包含当前程序文件名的字符串
6 printf(“%d\n”,LINE);//显示当前程序运行时所在行号(整数)
7 printf(“%s\n”,DATE);//当前日期
8 printf(“%s\n”,TIME);//显示时间

line 行号 //初始化行计数器

【扩展】typedef和#define的区别
1、执行时间不同
typedef是在编译阶段有效。

define在预处理阶段。//

2、功能不同
typedef是给类型起了一个别名,这些类型不只包含内部类型(int,char….),还包括自定义类型(struct….).
而宏就是简单地替换。
【扩展】
1、#运算符

include

include

include

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值