2019年7月5日星期五

1、在程序如何定義個變量?定義變量在內存中表明什麼意思?linux

一、 變量的定義?框架

格式:數據類型 + 變量   函數

數據類型 -> 決定在內存中佔用字節的大小。spa

變量名字 -> 決定如何訪問到這片內存的空間。 指針

 

二、初始化變量的值?生命週期

1)定義的同時初始化內存

   int a = 100;  作用域

 

2)先定義,後初始化。字符串

   int a;    -> 局部變量a = 隨機值it

            -> 全局變量a = 0

   a = 100;

 

注意:

"左值=右值"    -> 把右值(變量/常量)賦值給左值(只能是變量)。

"左值==右值"   -> 判斷左值是否等於右值?

 

三、 變量的生命週期以及做用域?

生命週期: 這個變量從何時出如今內存中到何時在內存中釋放。

做用域:變量可以做用的地方。

 

     局部變量     Vs    全局變量

 

1)在函數體內部定義的變量,就是局部變量,在函數體外部定義的變量,就是全局變量。

2)二者在內存中佔用的空間位置?

   局部變量都在存在於棧區,全局變量都是存在於數據段(已初始化->data段,未初始化->bss段)

3)變量不初始化,則局部爲隨機值,全局爲0。

4)局部變量做用域是函數內部,全局變量做用域整個程序。

5)局部變量在棧區申請空間,在定義該變量的函數結束時,這個局部變量的空間就會釋放。

   全局變量在數據段申請空間,程序結束時,全局變量的空間纔會被釋放。

 

 

四、形式參數屬於局部變量仍是全局變量?

局部變量,在棧區申請空間。

 

五、不一樣函數中能不能定義相同名字變量。

能夠,由於它們在棧區佔用不一樣的空間。

 

六、 全局變量的做用域?

只能往下,不能往上。

 

  練習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\n",b);

       return 0;

}

 

2、ASCII碼

一、 在Ubuntu中能夠查看ASCII碼錶

    man ASCII(按'q'退出)

 

二、 什麼是ASCII碼?

其實ASCII表就是字符、八進制、十進制、十六進制轉換。

 

 八進制   十進制   十六進制   字符

  Oct       Dec     Hex      Char

  060      48      30        0

  101      65      41        A

  141      97      61        a

 

 int a = 65;

 

 %d   -> 以十進制形式輸出內容   printf("%d\n",a); //65

 %o   -> 以八進制形式輸出內容   printf("%o\n",a); //101

 %x   -> 以十六進制形式輸出內容 printf("%x\n",a); //41

 %c   -> 以字符形式輸入內容     printf("%c\n",a); //'A'

 %f   -> 輸出浮點型數據,保留小數點後6位。

 

 %s   -> 輸出字符串

 %p   -> 輸出指針地址

 

 結論: 其實字符類型也是整型數據。

 

3、語句與表達式?

表達式 = 語句;

a = 5   把5賦值給a  -> 賦值語句

a = 5;  表達式

 

一、 逗號表達式?

計算規則:從左到右依次計算,結果以最後一個表達式爲準。

 

例子:

 

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

 

二、自增自減

 

  a++  先運算後,再自加1.

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

  a--  先運算後,再自減1.

  --a  先自減1,再運算.

 

例子:

int a = 10;

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

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

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

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

 

三、 +=  -=  *=  /=  %=

 

  a+=5  等價於  a=a+5

 

四、 三目運算

形式:

表達式?結果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;

 

4、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\n",a);

      

       return 0;

}

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

 

5、linux C語言控制流

控制流有兩大塊,分別是分支、循環。

分支: if  else  switch

循環: for  while  do-while

 

一、 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\n",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\n",sum);

      

       return 0;

}

 

二、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\n",sum);

      

       return 0;

}

 

 

三、 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\n",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\n",sum);

 

 

四、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:\n");
 scanf("%d",&a);//輸入數字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small\n");
 if(a >= 101 && a <= 200)//101~200 -> 打印middle
  printf("middle\n");
 if(a >= 201 && a <= 300)//201~300 -> 打印large
  printf("large\n");
 if(a < 0 || a > 300)//不在上訴範圍輸出error
  printf("error\n");
 return 0;
}
======================================================================================================================================================
#include <stdio.h>
int main(int argc,char *argv[])
{
 int a=0;
 printf("Please enter the number:\n");
 scanf("%d",&a);//輸入數字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small\n");
 else
 {
  if(a >= 101 && a <= 200)//101~200 -> 打印middle
   printf("middle\n");
   else
   {
    if(a >= 201 && a <= 300)//201~300 -> 打印large
     printf("large\n");
    else//不在上訴範圍輸出error
     printf("error\n");
   }
 }
 return 0;
}
=====================================================================================================================================================
#include <stdio.h>
int main(int argc,char *argv[])
{
 int a=0;
 printf("Please enter the number:\n");
 scanf("%d",&a);//輸入數字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small\n");
 else if(a >= 101 && a <= 200)//101~200 -> 打印middle
  printf("middle\n");
 else if(a >= 201 && a <= 300)//201~300 -> 打印large
  printf("large\n");
 else       //不在上訴範圍輸出error
  printf("error\n");
 return 0;
}
 
===========================================================================================================================================================
相關文章
相關標籤/搜索