复习部分
-
定义变量时:类型 标识符;
注意1.标识符不能写拼音2.标识符是以下划线、字母、数字的组合,在本次讲述中一般用字母开头,用数字结束。3.不能用关键字命名如int char break case等4.见名知意5.定义时给予初始化。
e.g.
{char ch=‘\0’;
int a=0;//初始化
a=100;//赋值
return 0;
} -
运算符:
1.关系运算符:> >= < <= == != 这些运算出来是个布尔值非0即1,注意书写不要分隔开来。
2.逻辑运算符:&& (简洁与) || (简洁或)代表两个布尔值了
e.g.
# include <stdio.h>
int main
int a=-2;
int b=10;
if(b>5 && ++a);//改为if(b>15 && ++a)就另有乾坤了
{ printf("b>5&&++a\n");}//第二个改为b>15就为否了,就不运行&&后的一步了
printf("a=%d \n");
}
printf("a=%d\n",a);//第一个输入为 b>5&&++a -1;第二个输入为 -2
return 0;
}
3.自增运算符
b=++a 需要把a取出放在临时空间,临时空间+1再给a,a赋值给b
b=a++ 需要把a放在临时空间赋值给b,然后a自增1
则++a=b 可编译;a++=b不可编译因为临时空间只具有可读性,只读不可写
则c=a+b正确,a+b=c错误
- scanf 和printf
#include<stdio.h>
int main()
{
int a=0;
char ch='\0';
scanf("%d %c",&a,&ch);//12 a 需要注意输入a时&为取地址,取ch的地址,即为输入值a的ASCALL码
printf ("a=%d ch=%c\n",a,ch);//以ASCALL码的形式存放的ch输出为字符形式于是又转换成a
return 0;
}
- 作业的讲解
猜任意一年是否为闰年:
#include<stdio.h>
int main()
{ int year=0;
printf("please input a year"\n);
scanf("%d",&year);
if (year%4==0&&year%100!=0||year%400==0)
printf{"%d is leap year\n",year};
else
printf{"%d isn't leap year\n",year};
函数
- 函数是C语言所执行的最小单元;
- 不允许在函数中嵌套函数
- 函数的构成:返回类型 函数名称(见名知意) 形参历表
e.g. bool Is-Leap(int year,int month)
返回类型/ 函数名称/形参历表(形态前为类型) - 举个例子
bool Is-Leap(int year)
{
if (year%4==0 && year%100!=0 ||year%400==0)
{
return true;
}
else
{
return false;
}
}//定义了一个名为Is-Leap的函数
int main ( )
{
int year;
bool leap;
scanf ("%d",&year);
leap=Is-Leap(year);//实参形参在不同栈帧(可看做大楼)中,在此为实参返回函数的形参中
printf(%d\n,leap);
return(0);
}
- 练习
- 输入年份和月份,判断这一年的这一个月有多少天?
int YearMon-To-Day(int year,int month)
{
if(month ==1||month ==3||month ==5||month ==7||month ==9||month ==11||month ==12)
return(31)
if(month ==4||month ==6||month ==9||month ==11)
return(30)
if(month ==2)
if (year%4==0 && year%100!=0 ||year%400==0)
{
return 29;
}
else
{
return 28;
}
int main ()
{
int year=0;
int month=0;
int days=0;
printf("please input year month\n");
scanf("%d %d",&year,&month);
days=YearMon-To-Day(year,month);
printf("%d year %d month %d day\n",year,month,days);
return 0;
}
switch语句
switch(整型变量)
{
case 0: break;
case 1: break;
case 2: break;
case 3: break;
default;break;
}
- 举个例子,还是判断月份
#include<stdio.h>
int main ()
{
int year=0;
int month=0;
int days=0;
printf("please input year month\n");
scanf("%d %d",&year,&month);
switch (month)
{
case1:case 3:case 5:case 7:case 8:case 10:case 12:
day=31;
break;
case 4:case 6:case 9:case 11:
day=30;
break;
case 2 :
if (year%4==0 && year%100!=0 ||year%400==0)
{
day=29;
}
else
{
day=28;
}
break;
}
作业
#include<stdio.h>
int main()
char ch1=‘a’;
char ch2=‘ab’;
char ch3=‘abc’;
char ch4=‘abcd’;
int x1=‘a’;
int x2=‘ab’;
int x3=‘abc’;
int x4=‘abcd’;
printf("%x %x %x %x\n",ch1,ch2,ch3,ch4);
printf("%x %x %x %x\n",x1,x2,x3,x4);
编译器工作的原理和调试
编译器工作原理
- .h文件为头文件:只能声明变量,不能定义变量.c为C的源文件.cpp为C++的源文件这些都是文本文件,文本文件不能执行
- 编译器工作原理分三步
1.预编译.i文件
2.编译(汇编代码,.o.文件obj文件)
转化为汇编码,这种文件称为目标文件。后缀为.obj。
3.链接(二进制机器码,.exe文件)将汇编代码转换为机器码,生成可执行文件。 - 编译器结构
代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的。
数据区:存放已初始化的全局变量、静态变量(全局和局部)、常量数据。
栈区:由编译器自动分配释放,存放函数的参数值、返回值和局部变量,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须程序员手动管理。
堆区:堆是由malloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放工作由程序员控制,容易产生内存泄漏。
注意:凡是函数中定义的变量,分配的空间在栈中,凡是在函数外定义的变量,分配的空间在数据区
调试
- &的讨论(四种表示):操作符不能脱离环境讨论
1.表示取地址:取的是存储单位
2.a && b表示逻辑与
3.a&b表示对应位与:
char a=10;
char b=20;
c=a&b;//表示0,因为对应位与
0000 1010
0001 0100
0000 0000
4.别名和引用
int a=10;
int b=a;//表示把a的值给b
int &c=a;//a和b表示同一个实体
注意
别名必须进行初始化int &y是错误的,不能进行引用的引用int &&c=a是错误的
通过一个例子讲述调试
#include <stdio.h>
int Add (int a,int b)
{
int c=a+b;
return c;
}
int main()
{
int x,y,z;
scanf("%d %d",&x &y);
z=Add(x,y);
printf("z=%d\n",z);
return 0
}
在内存中的过程如图
调试时:执行一行,并进入函数
逐过程:执行并不进入函数
跳出:脱离此函数
注意:可见性针对的是编译、链接过程(仅在自己的函数中应用);生存期针对的是执行过程