C程序设计基础(二)

复习部分

  • 定义变量时:类型 标识符;
    注意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);
 }
  • 练习
  1. 输入年份和月份,判断这一年的这一个月有多少天?
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
}

在内存中的过程如图
在这里插入图片描述
调试时:执行一行,并进入函数
逐过程:执行并不进入函数
跳出:脱离此函数
注意:可见性针对的是编译、链接过程(仅在自己的函数中应用);生存期针对的是执行过程

猜你喜欢

转载自blog.csdn.net/qq_43597310/article/details/83934405