第一部分 基础语法
一、关键字
C语言默认提供的有特殊含义的符号,并且都是小写,不能再将它们用作标识符。在Xcode中颜色显示为玫红色。
二、标识符
1、程序员自己定义的一些符号和名称。
2、标识符命名
(1)规则:
1> 只能由26个引文字母的大小写、10个阿拉伯数字0~9、下划线_组成。
2> 严格区分大小写,比如test和Test2是两个不同的标识符。
3> 不能以数字开头,不能使用关键字作为标识符。
(2)规范:
1> 名称要有意义,比如完整的英文或者拼音。
2> 如果标识符中有多个单词,尽量使用驼峰标识,即从第二个单词开始,首字母大写,如果是拼音用_分隔。
三、注释
1、用来解释某一段程序的或者某一段代码的含义,方便程序员之间交流,在xcode中,注释默认的颜色是豆绿色,我们可以通过颜色直观的来分辨出是否是注释。
2、注释只要不影响到程序的运行,位置是不固定的,函数内或者函数外都可以。并且只要被注释掉的内容,不参与编译,通过查看.o目标文件的字节数就可以知道。
3、单行注释//和多行注释/**/
//单行注释:这里是注释!!
/*多行注释:
这里是注释!!
printf("itcast\n");
*/
4、注释的作用
(1)利用注释分析代码含义
先运行整个程序,查看总体结果,然后把想了解的代码注释之后再运行程序,查看结果和总体结果的区别,那么就分析出代码的含义了。
(2)利用注释查找代码错误
把可疑代码注释掉之后运行程序,确定这行代码是否有错。
5、总结:
//正确用法
//1.单行嵌套多行形式的单行
//it/*cast*/
//2.单行嵌套单行
//it//cast
//3.多行嵌套单行
/*//itcast
*/
//错误用法
//1.单行嵌套多行
//it/*
cast*/
//2.多行嵌套多行
/*
/*itcast*/
*/
(1)把/**/写在一行,其实应当看成单行注释
(2)单行注释可以被嵌套
(3)多行注释不可以被任何形式的注释嵌套
四、数据
数据有大小,数据越大说明包含的0和1就越多,每一个比特位bit保存一个0或者一个1,一个字节保存8位bit。单位转换:1B = 8bit、1KB = 1024B、1MB = 1024KB、1GB = 1024MB、1TB = 1024GB。
1、常量:固定不变的值
(1)整型常量,比如1、3、5、0
(2)浮点型常量
1> 单精度float,数据都是以f结尾的,小数点后有6位。比如2.5f、0.0f
2> 双精度double,小数点后有位13。比如1.3、2.5
(3)字符常量,单引号括起来的单个字符,只能括住一个字符,不能是汉字。比如'a'、'$'
(4)字符串常量,双引号括起来的字符,字符数不限制。比如"itcast"、"as"
2、变量:当一个数据的值经常改变或者不确定,就需要定义为变量
(1)变量的定义
//数据类型 变量名
int score;
//连续定义3个char变量
char d, e, f;
(2)变量的赋值
score = 100;
//初始化:定义变量同时第一次赋值
char c = 'A';
(3)变量的输出
//%d %i输出整数,格式符(占位符)
printf("分数是%d\n", score);
//%f输出小数,默认是6位小数
printf("身高是%.2f\n", height);
//%c输出字符
printf("积分等级是%c\n", c);
(4)变量使用注意
1> 变量的作用域:从定义变量的那一行代码开始,一直到所在代码块结束
int b;
b = a; //报错,a未定义
int a = 10;
2> 代码块的作用域
{
int a = 10;
}
//报错,a是未定义的变量,因为a的作用域在代码块里面
printf("a = %d\n", a);
代码块的作用:及时回收不再使用的变量的存储空间,为了提升性能
3> 一个变量没有经过初始化,就不要使用该变量
int c;
int d = c + 1;
printf("d的值是%d\n", d);
//输出结果是
//d的值是1756581943
(5)变量小练习(用于面试)//不利用第三方变量来实现两个变量值的交换
int a, b;
a = b - a;
b = b - a;
a = b + a;
(6)变量的存储细节int main(void)
{
int a = 10;
int b = 20;
//输出a的地址,地址是0x7fff58b0ac08
printf("a的地址是%p\n", &a);
//b的地址是0x7fff58b0ac04
printf("b的地址是%p\n", &b);
return 0;
}
1> 不同数据类型所占据的存储空间也不同
2> 变量a和变量b怎么存储的,看下面示意图
* 内存寻址由大到小,优先分配内存地址大的字节给变量,变量数据类型决定了分配的字节数。
* 变量越先定义,内存地址就越大。
* 取得变量的地址:&变量名,变量的地址是字节最小的那个。
* 输出地址:%p。
五、scanf()函数
1、基本使用
#include
int main(void)
{
int number;
scanf("%d", &number);
printf("用户输入的值是%d\n", number);
return 0;
}
(1)scanf函数只接收变量的地址。
(2)scanf函数是一个阻塞式函数 ,会卡在scanf那行代码,等待用户输入。
(3)用户输入完毕后,会把输入的值赋值给变量number
2、其他用法及使用注意
// 1.输入字符
char myc;
scanf("%c", &myc);
// 2.一次性输入多个数值,并且以某些符号隔开
int num1, num2;
scanf("%d#%d", &num1, &num2);
// 3.如果scanf参数中以空格隔开,实际输入可以空格、回车、tab键作为分隔符
int num1, num2;
scanf("%d %d", &num1, &num2);
// 4.scanf中不能写\n
// 错误写法
int a;
scanf("%d\n", &a);
第二部分 基本运算
一、算术运算
1.基本使用
int a = 10 + 2 + 5 + 7;
int b = -5;
int c = 10 * b;
int d = 1 / 5;
int e = 24 % -5; //取余
(1)运算顺序:从左向右。
(2)取余运算符%两边的值都是整数,并且取余运算结果的正负只和%左边的值相关。
2.使用注意
(1)自动类型转换
int = 10.8; //double转换为int
(2)强制类型转换
int a = (int) 10.8; //double转换为int
(3)自动类型提升
double c = 10 + 6.6;
double e = (double)3 / 2;
1> 参与计算的数据是什么类型,那么最终的结果就是什么类型。
2> 其中占内存字节数小的类型转换成大字节类型。
二、赋值运算符
#include
int main(void)
{
int a = 10;
//复合赋值运算符
a += 5; //a = a + 5;
a *= 5; //a = a * 5;
a += 5 + 6 + 4; //a = a + (5 + 6 + 4);
printf("a = %d\n", a);
return 0;
}
三、自增自减运算符
1、基本使用
int main(void)
{
int a = 10;
a = a + 1; //11
a += 1; //12
a++; //13
++a; //14
a--; //a -= 1; 13
printf("%d\n", a);
}
(1)单独使用时,不管++和--是在前还是在后,最终的结果都是+1或-1。
int main(void)
{
int b;
int a = 10;
b = (a++) + (++a);
printf("a = %d, b = %d\n", a, b); // a = 10, b = 22;
}
(2)a++或a--:先使用a的值,再+1或者-1赋值给a。
++a或者--a:先把a的值+1或者-1之后赋值给a,再使用
2、注意:自增自减运算符不能用于常量
四、sizeof
1、用来计算一个变量或者一个常量、一种数据类型所占据的字节数。
2、基本形式:
// 1.正确形式
sizeof(变量\常量);
sizeof 变量\常量;
sizeof(数据类型);
// 2.错误形式
sizeof 数据类型;
五、关系运算符(比较运算符)
int main(void)
{
int result = 3 + 4 > 8 - 2;
printf("%d\n", result);
return 0;
}
1、任何数值都有真假性,任何非0值为真,0为假
2、如果条件成立则为真,返回1;如果条件不成立为假,返回0。
3、6种关系比较符,其中>、>=、 <=、 <高于==、!=,结合方向是从左到右。
六、逻辑运算符
1、逻辑与:条件A && 条件B
两个条件都成立时,结果才是1,为真
int a = 10 && 0;
printf("a = %d\n", a); // a = 0
//左边成立,才判断右边,如果左边不成立,右边不做判断
int a =10;
int b = 10;
int c = (a<5) && (++b>=11)
printf("a=%d, b=%d, c=%d\n", a, b, c); // a = 10, b = 10, c = 0
2、逻辑或:条件A || 条件B
两个条件有一个成立时,结果是1,为真,两个条件都不成立时,返回0。
int c = (1>8) || 0;
printf("c = %d\n", c); // c = 0
//左边成立,不判断右边,如果左边不成立,再判断右边
int a = 10;
int b = 10;
int c = (a>5) || (b++ - 10);
printf("a=%d, b=%d, c=%d\n", a, b, c); //a = 10, b = 10, c = 1
3、逻辑非:!条件A
条件A为成立,返回0;如果条件成立,就返回1
int a = !(10<8);
printf("a=%d\n", a); // a=1
七、三目运算符
1、格式:条件 ? 数值1 : 数值2;
2、利用三目运算符计算两个值中的最大值
//提示用户输入两个整数,输出最大值
#include
int main(void)
{
// 1.保存输入的两个整数
int num1, num2;
// 2.提示用户输入
printf("请输入两个整数,以空格隔开:\n");
// 3.接收输入
scanf("%d %d", &num1, &num2);
// 4.比较俩数,输出最大值
int max = (num1 > num2) ? num1 : num2;
printf("%d和%d的最大值是%d\n", num1, num2, max);
return 0;
}
运行结果: