day01
c语言基础
常用快捷键
shift 切换中英文
windows 相当于mac中的command
command + q 退出程序
command + c 复制
command + v 粘贴
mac中enter重命名
mac中常用指令
./ 当前目录
../ 上一级目录
/ 根目录
mkdir 创建目录
rm 删除目录
touch 创建文件
open 打开文件
pwd 显示当前路径
ls -l 查看当前目录中的所有文件及目录
ls 查看
XCode显示行号
XCode - preference - TextEditing - show line numbers
Mac安装CommandLineTools
方式一
终端安装:
sudo xcode-select --install
方式二
finder--GOTO-/System/Library/CoreServices --打开 Install Command Line Developer Tools.app
程序的编译链接运行
编译
cc -c .c(file) --->> soure to .o
链接
cc .o(file) --->> .o to .out
运行
./a.out(默认生成的就是这个)
编译+链接
cc .c(file)
运行
./a.out
编译+链接+命名 (把编译和链接生成之后的文件给删除掉了)
cc .c(file) -o a3.out
./a3.out
编译+命名
cc -c .c(file) -o a3.o
cc a3.o
./a.out
经验收集
输出语句中有特殊的输出需要注意如下:
/
例:
printf("*********** \n /hello \n *********** \n");
编译只会检查源代码中的语法问题,编译失败不会产生.o文件
能编译不一定能运行,就要有警告信息就一定会编译不通过
关键字
是 c 语言提供特殊信义的符号,也叫"保留字"
关键字全部小写
在xcode中显示的是红褐色
标识符是程序员自定义的一些符号和名称
例: 函数名称
关键字是c语言默认提供的符号,标识符是程序员自定义的
只要给事物贴标识符,就可以根据这个来区分事物
命名规则
只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_组成
命名规范(最好遵守)
尽量起个有意义的名称,比如一个完整的英文单词,别人一看这个名称就能才能这个标识符的作用。如果不懂英文,你也可以用拼音,尽量不要起像abcde、sfsdfsdf等这类看起来没有意义的名称
如果标识符中含有多个单词,可以使用驼峰标识(除开第一个单词,后面每个单词的首字母都是大写):firstName、myFirstName,或者使用下划线_来连接:first_name、my_first_name
注释:
- 解释代码
- 单行注释 //
- 多行注释
- 注释掉的内容不会参与编译,编译的时候会忽略注释
练习
1.c语言
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
2.java
class Demo{
public static void main(String[] args){
System.out.prinfln("hello");
}
}
3.objective-c(OC)
` #import <Foundation/Foundation.h>`
int main()
{
NSLog(@"hello");
return 0;
}
数据
- 静态数据: 一般都是以文件的形式存储在硬盘上
- 动态数据: 在程序运行过程中不断产生在临时数据。运行在内存中
1. 软件被关了
2.设备被关了
内存的访问速度比硬盘访问的数据要快
程序是安装在硬盘运行在内存
android 的三级缓存
加载: 内存-sd卡-网络
下载: 网络-sd卡+内存
- bit 比特位
- Byte 字节
- 01010100 = 1字节
- 1KB = 1024B
- 1MB = 1024KB
- 1GB = 1024MB
- 1TB = 1024GB
C语言的数据类型
- 基本数据类型
整数类型:int
浮点类型:
单精度float(默认6位),以f结尾
双精度double
字符型:char
- 指针类型
- 构造类型
把多种基本数据类型凑合成的一种新的类型`
- 指针类型
C语言中没有boolean类型可以使用int类型来模拟
0 暂停
1 开始
常量
就是些固定的数据
存储经常变动的不确定的数据
变量就是代表 内存中的一块存储空间
定义变量的目的是为了在内存中申请一块内存空间(地址空间)
常量类型的分类:
整数类型、浮点类型、字符类型('')、字符串类型("")
只要有不确定的数据就应该定义变量来保存
变量的定义
变量类型 变量名;
变量在定义之后在内存中就有存储空间了
类型的作用
限定变量在内存空间中申请的空间大小(类型不同申请的内存空间不同),节省内存空间
int: 4 Byte
char: 1 Byte
变量的输出
- 浮点型: %.nf .n小数的位数
- 浮点默认是6位小数
- 整数类型使用%d/%i都是可以的
- 点位符位置的数据使用常量也是可以的
练习
int score = 100;<br/>
float f = 32.5f;<br/>
double d = 3.1415926;<br/>
char name = 'c';<br/>
printf("score:%d\n",score);<br/>
printf("f:%.2f\n",f);<br/>
printf("d:%.10f\n",d);<br/>
printf("name:%c\n",name);<br/>
score:100<br/>
f:32.50<br/>
d:3.1415926000<br/>
name:c<br/>
变量的作用域
变量在函数中的作用域
1.作用域(作用范围)
从变量定义的那一行开始,一直到所在的代码块结束<br/>
分配存储空间也是从定义变量的那一行开始分配的
2.代码块
及时回收不再使用的变量,为了提升性能<br/>
代码块: 限制代码的作用域
3.不同类型所占据的存储空间(64位编译器)
char 1
int 4
float 4
double 8
练习:交换两个变量的值(两种方式)
第一种方式(需要定义新的变量)
/*
a = 10
b = 11
交换之后
a -> 11
b -> 10
原理:
交换两个杯子中的水
*/
int main()
{
// 交换之前
int v1 = 10;
int v2 = 20;
printf("change before:%d\n",v1);
printf("change before:%d\n",v2);
// 第一种交换方式
// 交换之后
int tmp = v1;
v1 = v2;
v2 = tmp;
printf("change after:%d\n",v1);
printf("change after:%d\n",v2);
return 0;
}
第二种方式(不需要定义新的变量)
/*
a = 10
b = 11
交换之后
a -> 11
b -> 10
原理:
交换两个杯子中的水
*/
int main()
{
int v1 = 10;
int v2 = 20;
printf("v1 change before:%d\n",v1);
printf("v2 change before:%d\n",v2);
// 第二种交换方式
v1 = v2 - v1; // v1 = 20 - 10 = 10
v2 = v2 - v1; // v2 = 20 - 10 = 10
v1 = v1 + v2; // v1 = v1 + v2 = 20
printf("v1 change after:%d\n",v1);
printf("v2 change after:%d\n",v2);
return 0;
}
scanf函数
- printf 输出到终端
- scanf 接收终端用户的输入
内存以以”字节为单位”
1个字节8位
1GB=1024MB=1024*1024KB=1024*1024*1024B
每个字节都有自己的内存地址,根据内存地址就能找到对应的字节
相临字节的内存地址是连续的
内存地址是十六进制的 0x
不同类型占用的字节是不一样的,数据越大,所需要的字节数越多
- 内存寻址:内存寻找自己的地址
- 内存分配的时候是从大到小进行分析。(优先分配大的地址给变量)
- &地址运算符,取得变量在内存中的地址
总结
-
- 内存寻址由大到小,优先分配内存地址比较大的字节给变量
-
- 变量越先定义,内存地址就越大
-
- 取得变量地址:&变量名
-
- 输出地址:%p
java是强类型,变量定义未初始化不可以拿来使用
c是弱类型(变量定义直接拿来使用虽然不报错但是这样做是不对的)
scanf函数使用特点
- scanf函数只接收变量的地址
- scanf函数是一个阻塞式的函数,等待用户输入
- 用户输入完毕后,就会将用户输入的值赋值给number变量
scanf练习
#include <stdio.h>
int main()
{
// 1.定义两个变量记录用户的输入
int num1,num2;
// 2.提示用户输入
printf("请您输入第一个数字\n");
scanf("%d",&num1);
printf("您输入的数字是:%d\n",num1);
// 3.提示用户输入
printf("请您输入第二个数字\n");
scanf("%d",&num2);
printf("您输入的数字是:%d\n",num2);
printf("准备对结果进行计算...\n");
// 4.计算两个数的和
int sum = num1 + num2;
printf("计算的结果:%d\n",sum);
return 0;
}
其它练习总结
-
- 输入字符
-
- 一次性输入多个数值,并且以某些符号隔开
-
- 如果scanf参数中以空格隔开,实际输入可以以空格,tag,回车作为空格符
-
- scanf中不能写\n
输入多个字符练习:
int main()
{
// 输入字符
/*
char c;
scanf("%c",&c);
printf("输入的字符:%c\n",c);
*/
// 连续输入数字
/*
int num1,num2,num3;
printf("请输入多个数字,以#隔开\n");
scanf("%d#%d#%d",&num1,&num2,&num3);
printf("num1 = %d,num2 = %d,num3 = %d\n",num1,num2,num3);
*/
// 连续输入数字
int num4,num5,num6;
printf("请输入多个数字,以空格隔开\n");
scanf("%d %d %d",&num4,&num5,&num6);
printf("num4 = %d,num5 = %d,num6 = %d\n",num4,num5,num6);
return 0;
}
结果展示
userdeMac:demos user$ ./a.out
请输入多个数字,以#隔开
25#33#47
num1=25,num2=33,num3=47
userdeMac:demos user$ cc scanf练习3.c
userdeMac:demos user$ ./a.out
请输入多个数字,以空格隔开
44 22 35
num4 = 44,num5 = 22,num6 = 35
userdeMac:demos user$ ./a.out
请输入多个数字,以空格隔开
22
33
55
num4 = 22,num5 = 33,num6 = 55