Day4.switch和for循环
Switch用法
- 拿到条件表达式的返回值(注意返回值必须是整型)
- 利用条件表达式的返回值和switch后面大括号中的每一个case进行比较, 判断条件表达式的返回值和case后面的整数是否相等 条件表达式 == 整数
- 如果条件表达式的返回值等于某一个case后面的整数, 那么就会执行该case后面的语句
- 执行完语句之后如果遇到break就会结束整个switch语句, 也就是说后面的所有语句都不会被执行
- 如果前面的case不满足, 也就是前面的case的整数和条件表达式的返回值不相等就会继续判断后面的case
- 如果前面所有的case都不满足, 就会执行default后面的语句
/*
// Switch的条件表达式必须是返回整数的表达式, 也就是说()中只能放整数
// 或者写能够转换为整数的类型也可以, 例如char, 因为char类型可以转换为int类型, 所以写char也可以
switch ('A') {
case 6:
printf("6");
break;
case 8:
printf("8");
break;
default:
printf("other");
break;
}
*/
case的取值不能重复
case后面不能放变量, 因为系统在编译的时候会对Switch后面所有的case进行优化, 会根据case后面的常量值, 生成一张取值表
Switch中的default可以随便放
无聊default写到什么地方, 它都会最后执行(只有前面所有的case都不满足的情况才会执行)
- 什么时候用switch, 什么时候用if
在开发中一般情况下用if, if比较灵活
如果说是对一些固定的值进行判断, 并且这些值得数量不多的情况, 可以使用switch
从理论上来说, switch的性能效率比if高
- 什么时候用switch, 什么时候用if
Day5.函数递归函数和多文件开发
函数的声明和递归函数
很简单可以看些代码
1, include函数的使用
告诉系统printf函数是存在的。
include后面的 <> 和 "" 的区别
>如果使用<>代表会先从开发工具的编译环境中去查找
+ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/
>如果编译环境中没有找到, 那么会再去系统的编译环境中找
+ /usr/include/stdio.h
>如果使用""代表会先从当前文件所在的文件夹下面查找
>如果在当前文件所在的文件夹下面没有找到, 那么就回去开发工具的编译环境中去查找
>如果编译环境中没有找到, 那么会再去系统的编译环境中找
注意: include后面不一定要写文件名称 也可以写路径(相对路径/ 全路径)
#include "/Users/xiaomage/Desktop/课堂共享/day05/code/day05/include基本概念/abc/lnj.txt"
2, 多文件开发
要引用lisi的文件 只需建立一个lisi.h文件,然后再zhangsan.c中导入lisi.h
Day6.进制
1, 进制的了解
// 1.默认就是10进制
int num = 12;
// 2.在前面加上一个0就代表八进制
int num1 = 014;
// %d是以十进制的方式输出一个整数
printf("%d\n", num1);
// %o是以八进制的方式输出一个整数
printf("%o\n", num);
// 在数值前面加上0b就代表二进制
int num2 = 0b1100;
printf("%d\n", num2);
// 在数值前面加上0x就代表十六进制
int num3 = 0xc;
printf("%d\n", num3);
// %x是以十六进制的方式输出一个整数
printf("%x\n", num);
// 口诀:不看你怎么存,只看你怎去取
2, 原码反码补码
1, 正数的特点:(三码合一) 正数的原码就是TA的反码就是TA的补码
2, (反码, 符号位不变其它位取反)
3, (补码 , 反码+1)
结论:无论正数负数在内存中存储的都是补码
3, 存储的细节
// 变量为什么要有类型? 每种类型占用的内存空间不一样 int 4, char 1 double 8
// 只要定义变量, 系统就会开辟一块存储空间给我们的变量存储数据, 内存寻址是从大到小
// 越先定义的变量, 内存地址越大
// 变量的地址就是所占的存储空间最小的字节地址
int num;
// 注意: 由于内存寻址是从大到小, 所以存储数据也是从大到小的存储(先存储二进制的高位, 再存储低位)
// 高位 --> 低位
// 00000000 00000000 00000000 00001001
num = 9; // 9 -->二进制 -->存储(补码)
int value;
value = 600; //00000000 00000000 00000010 01011000
// %p是输出地址
// &变量名称, 是取出变量的地址
printf("num = %p\n", &num);
printf("value = %p\n", &value);
4, 进制类型说明
类型说明符:
1.说明长度的(它可以用于修改类型所占用的存储空间的大小)
short; short == short int == 2个字节 == %hi/ %hd
long; long == long int == 8个字节 == %li / %ld
long long; == long long int == 8个字节 == %lli / %lld
用于说明数据类型, 一般情况下和int配合使用
2.说明符号位(它可以用于修改符号位是否用于正负数)
unsigned; 无符号 , 取值正数和零 == %u
signed; 有符号, 默认就是有符号 , 取值 正数和零以及负数
3.不同类型的说明符可以混合使用
unsigned short
signed long
// 注意: 相同类型不能在一起使用
unsigned signed
Day7.数组和排序
函数和数组
// 基本数据类型作为函数的参数是值传递
// 如果形参是基本数据类型, 在函数中修改形参的值不会影响到实参的值
void change(int value)
{
value = 55;
}
// 注意: 数组名作为函数的参数传递, 是传递的数组的地址
// 因为数组名就是数组的地址 &number = &number[0] == number
// 注意: 如果数组作为函数的形参, 元素的个数可以省略
// 如果形参是数组, 那么在函数中修改形参的值, 会影响到实参的值
//void change2(int values[2])
void change2(int values[])
{
// values[0] = 88;
values[1] = 99;
}
int main(int argc, const char * argv[]) {
/*
int num = 10;
change(num);
printf("num = %i\n", num);
*/
int nums[2] = {1, 5};
/*
change2(nums); // 相当于传递了数组的地址
printf("nums[1] = %i\n", nums[1]);
*/
change(nums[0]);
printf("nums[0] = %i\n", nums[0]);
return 0;
}
Day8.二维数组、字符串和指针
1, 二维数组
元素类型 数组名称[行数][列数];
int scoress[3][5] =
{
{1, 3, 5, 7, 9}, // 0 // 每一个一维数组都是二维数组的一个元素
{2, 4, 6, 8, 10},// 1
{1, 2, 3, 4 , 5} // 2
};
char names[2][3] =
{
{'l', 'n', 'j'}, // 0
{'x', 'm', 'g'} // 1
};
// &names == names == &names[0] , names就是数组的地址
注意点:1,以后只要看到函数的参数是一个数组, 那么就是地址传递
2, 在函数中修改形参的值会影响到参数
2,字符串
C语言规定, 字符串必须以\0结尾(作为字符串的结束符号), 所以字符串变量的元素个数比字符数组的元素个数多一个 \0
3,指针
int *p; // 指针 , 在64位编译器下占用8个字节
// 千万注意: 指针变量只能存储地址
p = # // 将num的地址存储到p这个指针中
// 4.不要访问野指针
/*
// 没有赋值的指针, 我们称之为野指针
// int *p;
int *p = NULL; // 0
printf("%i\n", *p);
*/
多级指针
char c = 'a';
char *cp;
cp = &c;
char **cpp;
cpp = &cp;
char ***cppp;
cppp = &cpp;
printf("cppp = %c\n", ***cppp);
/*
*cp == c;
*cpp == cp;
**cpp == *(*cpp) == *cp == c
多级指针的操作, 最简单的方式, 就是通过几颗星来存储, 就通过几颗星来访问
还有一种方式就是画图, 看图片中有几个箭头, 有几个简单就用几颗星来访问
*/