2019年7月5日星期五(C语言)

一、在程序如何定义个变量?定义变量在内存中代表什么意思?

1、 变量的定义?

格式:数据类型 + 变量  

数据类型 -> 决定在内存中占用字节的大小。

变量名字 -> 决定如何访问到这片内存的空间。 

2、初始化变量的值?

1)定义的同时初始化

   int a = 100; 

 

2)先定义,后初始化。

   int a;    -> 局部变量a = 随机值

            -> 全局变量a = 0

   a = 100;

 

注意:

"左值=右值"    -> 把右值(变量/常量)赋值给左值(只能是变量)。

"左值==右值"   -> 判断左值是否等于右值?

 

3、 变量的生命周期以及作用域?

生命周期: 这个变量从什么时候出现在内存中到什么时候在内存中释放。

作用域:变量能够作用的地方。

 

     局部变量     Vs    全局变量

 

1)在函数体内部定义的变量,就是局部变量,在函数体外部定义的变量,就是全局变量。

2)两者在内存中占用的空间位置?

   局部变量都在存在于栈区,全局变量都是存在于数据段(已初始化->data段,未初始化->bss段)

3)变量不初始化,则局部为随机值,全局为0。

4)局部变量作用域是函数内部,全局变量作用域整个程序。

5)局部变量在栈区申请空间,在定义该变量的函数结束时,这个局部变量的空间就会释放。

   全局变量在数据段申请空间,程序结束时,全局变量的空间才会被释放。

4、形式参数属于局部变量还是全局变量?

局部变量,在栈区申请空间。

 

5、不同函数中能不能定义相同名字变量。

可以,因为它们在栈区占用不同的空间。

 

6、 全局变量的作用域?

只能往下,不能往上。

 

  练习1: 以下程序在内存空间中是如何变化的?结果是多少?

 

#include <stdio.h>

 

int fun2(int c)

{

       c = 20;

       return 0;

}

 

int fun1(int b)

{

       int c = 10;

       fun2(c);

       return 0;

}

 

int main(int argc,char *argv[])

{

       int a,b = 5;

       fun1(b);

       printf("b = %d ",b);

       return 0;

}

 

二、ASCII码

1、 在Ubuntu中可以查看ASCII码表

    man ASCII(按'q'退出)

 

2、 什么是ASCII码?

其实ASCII表就是字符、八进制、十进制、十六进制转换。

 

 八进制   十进制   十六进制   字符

  Oct       Dec     Hex      Char

  060      48         30          0

  101      65         41          A

  141      97         61          a

 int a = 65;

 %d   -> 以十进制形式输出内容   printf("%d ",a); //65

 %o   -> 以八进制形式输出内容   printf("%o ",a); //101

 %x   -> 以十六进制形式输出内容 printf("%x ",a); //41

 %c   -> 以字符形式输入内容     printf("%c ",a); //'A'

 %f   -> 输出浮点型数据,保留小数点后6位。

 

 %s   -> 输出字符串

 %p   -> 输出指针地址

 结论: 其实字符类型也是整型数据。

三、语句与表达式?

表达式 = 语句;

a = 5   把5赋值给a  -> 赋值语句

a = 5;  表达式

1、 逗号表达式?

计算规则:从左到右依次计算,结果以最后一个表达式为准。

例子:

d = (a=a+b,c=b+c,a+c); 

a=1+2=3

c=2+3=5

d=a+c=3+5=8

例子:

int a=1,b=2,c=3,d;

d = (a+b,b-=c,c+=c);  -> 6

d = (c=a+b,b-=c,c+=b); -> 2

2、自增自减

 

  a++  先运算后,再自加1.

  ++a  先自加1,再运算.

  a--  先运算后,再自减1.

  --a  先自减1,再运算.

例子:

int a = 10;

printf("%d ",a++);//10   a=11

printf("%d ",++a);//12   a=12

printf("%d ",a--);//12   a=11

printf("%d ",--a);//10   a=10

3、 +=  -=  *=  /=  %=

  a+=5  等价于  a=a+5

4、 三目运算

形式:

表达式?结果1:结果2;

如果表达式为真,则结果就是结果1。

如果表达式为假,则结果就是结果2。

例子1:

int a = 3,b = 2,c;

c = (a >= b ? a : b);  -> 求a与b之间的最大值。

例子2:

A ? i : j; 以下哪个表达式与之等价?    假 -> 0  真  -> 1 

A==0 ? i:j;

A!=0 ? i:j;  ->  OK

A==1 ? i:j;

A!=1 ? i:j;

四、IO函数?

头文件:#include <stdio.h>

printf()  -> 输出带格式内容到屏幕上

scanf()   -> 从键盘中输入带格式内容 

int a;

a  -> 代表这整片内存空间

&a -> 代表这整片内存空间的地址

例子:

===================================================

#include <stdio.h>

 

int main(int argc,char *argv[])

{

       int a;

      

       scanf("%d",&a);

      

       printf("%d ",a);

      

       return 0;

}

===================================================

五、linux C语言控制流

控制流有两大块,分别是分支、循环。

分支: if  else  switch

循环: for  while  do-while

 

1、 while循环

1)基本框架

while(判定条件)

{      -> 复合语句:循环体

       表达式;

}

-> 循环体之外 

2)处理流程

判定条件  ->  真  -> 执行循环体内容  -> 判定条件   ->  假  -> 跳出循环

3)死循环

死循环就是判定条件恒为真,无法通过判断判定条件为假来跳出循环。

while(1)

{

       xxxx;  -> 一直执行!

}

 

4)省略{}写法

======================================================

while(1)

   xxxx;   -> 紧跟while(1)语句的表达式就是循环体的内容

   yyyy;   -> 不属于循环体的内容

 

等价于

while(1)

{

   xxxx;

}

yyyy;

======================================================

 

while(1);  -> 有分号,有循环,但是循环体没有内容。

  xxxx;

  yyyy;

等价于

while(1)

{

 

}

xxxx;

yyyy;

   结论: 当循环体表达式大于2个时,复合语句{}不能省略!

          当循环体表达式只有1个,则{}可以省略!

  练习2: 使用while循环实现将所有的参数都打印出来!

#include <stdio.h>

int main(int argc,char *argv[])  //  ./xxx aaa bbb   argc=3  argv[0]="./xxx"  argv[1]="aaa"

{

       int i = 0; //初始化语句

       while(i < argc)  //0~2   判定条件

       {

              printf("argv[%d] = %s ",i,argv[i]);

              i++; //条件修改

       }  

       return 0;

}

  练习3: 从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x

#include <stdio.h>

int main(int argc,char *argv[])

{

       int x,i=1,sum=0;

       scanf("%d",&x);

      

       while(i<=x)

       {

              sum += i;

              i++;

       }

      

       printf("sum = %d ",sum);

      

       return 0;

}

2、for循环

1)基本框架

for(初始化语句;判定条件;变量操作)  -> 里面三个语句不一定要填,可以空白!

{  -> 循环体 

}

循环体之外。

 

2)处理流程

1

for(2;3;4)

{

   5;

}

6;

 

1->2->3->真->5->4->3->假->6    (初始化语句,只会执行一次)

 

3)死循环

for(;;); 等价于  while(1); 

 

等价于          等价于

for(;;)  等价于  while(1)

{             {

 

}             }

 

4)省略{}写法

for(;;)

   xxxx;  -> 紧跟语句才是循环体的内容

   yyyy;  -> 不属于循环体的内容

 

等价于

for(;;)

{

   xxxx;

}

yyyy;

 

  练习4: 从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x,要求使用for循环。

 

#include <stdio.h>

 

int main(int argc,char *argv[])

{

       int x,i,sum=0;

       scanf("%d",&x);

      

       for(i=1;i<=x;i++)

       {

              sum += i;

       }

      

       printf("sum = %d ",sum);

      

       return 0;

}

 

 

3、 do-while循环

1)基本框架

do{   -> 循环体

 

}while(判定条件);   -> 注意: 没有分号是语法出错!

 

2)处理流程

先执行一遍循环体  ->  判定条件  -> 真  -> 执行循环体   -> 判断条件  -> 假  -> 跳出循环

 

3)死循环

do{

 

}while(1);

 

4)省略{}写法

例子1:

do

  xxxx;

while(1);

 

等价于

do{

  xxxx;

}while(1);

 

例子2:

do

  xxx;

  yyy;    -> 编译出错: error: expected ‘while’ before ‘printf’

while(1);

 

  结论: 当表达式只有一条时,则复合语句可以省略,如果大于1条表达式,则必须添加,否则编译出错。

 

while(1)

   xxxx;

   yyyy;

 

等价于

do

  xxxx;

while(1);

yyyy;

 

 

   练习5:使用do-while循环实现将所有的参数都打印出来!

 

   int i = 0;

   do{

       printf("argv[%d] = %s ",i,argv[i]);

       i++;

   }while(i<argc);

 

   练习6:从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x,要求使用do-while循环。

 

   int x,i=1,sum=0;

   scanf("%d",&x);

 

   do{

       sum+=i;

       i++;

   }while(i<=x);

   printf("sum = %d ",sum);

 

 

4、if分支

 

用法一: if单独使用

 

1)基本框架

if(判定条件)   -> 如果判定条件为真,则执行复合语句,否则不执行复合语句!

{    //复合语句

 

}

 

2)省略{}写法

if(判定条件)

   xxxx;   -> 如果条件为真,则执行xxxx;如果为假,就不执行xxxx;

   yyyy;   -> yyyy;不是if语句的判定范围,所以无论条件真假,这个yyyy都会被执行。

 

等价于

if(判定条件)

{

   xxxx;

}

yyyy;

 

================================================

 

if(判定条件);

    xxxx;

    yyyy;

 

等价于

if(判定条件)

{

 

}

xxxx;

yyyy;

 

 

用法二: if与else配合使用

1)基本框架

if(判定条件)   -> 如果判定条件为真,就执行复合语句1

{  //复合语句1

 

}

else     -> 不满足判定条件的情况,就会执行复合语句2

{  //复合语句2

 

}

 

2)省略{}写法

if(判定条件)

   xxxx;

else

   yyyy;    --> 可以!

 

 

if(判定条件)  xxxx   else   yyyy;   -> 编译出错: expected ‘;’ before ‘else’

 

 

 

if(判定条件)

   xxxx;

else

   yyyy;

else

   zzzz;  --> 编译出错: error: ‘else’ without a previous ‘if

 

 

if(判定条件1)

   xxxx;

if(判定条件2)

   yyyy;

else

   zzzz;   -> 编译通过,else受到最近的if语句的影响!

 

 

用法三: 多个情况判断  else if

1)基本框架

if(判定条件1)  -> 如果判定条件1是真,则执行复合语句1

{  //复合语句1

 

}

else if(判定条件2)  -> 如果判定条件1为假,则进行判断判定条件2,如果为真,则执行复合语句2

{  复合语句2

 

}

else    -> 不满足以上所有的判定条件,则执行复合语句3。

{  复合语句3

 

}

 

 

   练习7: 分别使用以上三种办法,完成该题。

          从键盘中获取一个数字

        0~100   -> 打印small

         101~200 -> 打印middle

          201~300 -> 打印large

 

   完成:<练习>

======================================================================================================================================================

#include <stdio.h>
int main(int argc,char *argv[])
{
 int a=0;
 printf("Please enter the number: ");
 scanf("%d",&a);//输入数字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small ");
 if(a >= 101 && a <= 200)//101~200 -> 打印middle
  printf("middle ");
 if(a >= 201 && a <= 300)//201~300 -> 打印large
  printf("large ");
 if(a < 0 || a > 300)//不在上诉范围输出error
  printf("error ");
 return 0;
}
======================================================================================================================================================
#include <stdio.h>
int main(int argc,char *argv[])
{
 int a=0;
 printf("Please enter the number: ");
 scanf("%d",&a);//输入数字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small ");
 else
 {
  if(a >= 101 && a <= 200)//101~200 -> 打印middle
   printf("middle ");
   else
   {
    if(a >= 201 && a <= 300)//201~300 -> 打印large
     printf("large ");
    else//不在上诉范围输出error
     printf("error ");
   }
 }
 return 0;
}
=====================================================================================================================================================
#include <stdio.h>
int main(int argc,char *argv[])
{
 int a=0;
 printf("Please enter the number: ");
 scanf("%d",&a);//输入数字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small ");
 else if(a >= 101 && a <= 200)//101~200 -> 打印middle
  printf("middle ");
 else if(a >= 201 && a <= 300)//201~300 -> 打印large
  printf("large ");
 else       //不在上诉范围输出error
  printf("error ");
 return 0;
}
 
===========================================================================================================================================================
原文地址:https://www.cnblogs.com/zjlbk/p/11153523.html