IOS入門教程(三)-C語言特性 – iPhone手機開發技術文章 iPhone軟體開發教學課程

//3.C語言特性
  //3.1函數的定義
  //函數返回類型 函數名(參數){
    //dosomthing
  //}一般的函數定義都是這樣的,

  //有一種古老的函數定義方式,另外起一行對參數進行說明
  void printMesg(msg,loopNum)
  int loopNum;
  int msg;
  {   int i;
      for(i = 0;i<loopNum;i++){
       printf("第%d次循環%d \n",i+1,msg);
      }
  }

  //3.2函數聲明
  //函數的聲明是用於函數的使用在定義之前
  int add(int a,int b);
  //int main(){
  // int maxInt = add(3,8);
  //}
  int add(int a,int b){
    return a+b;
  }

  //3.3參數的傳遞,Object-C使用的是值傳遞
  void swap(int a,int b){
   int temp = a;
   a = b;
   b = temp;
   printf("a的值是%d,b的值是%d",a,b);
  }
  //對於指針類型的變量,同樣使用的是值傳遞
  /*
  Draw是一個類 裡面有兩個屬性 int a,int b;
  void swap(Draw * dw){
   int temp = dw.a;
   dw.a = dw.b;
   dw.b = temp;
  }
  int main (){
   Draw dw = [Draw alloc] init];
   dw.a = 6;
   dw.b = 9;
   return 0;
  }
  */
  //dw 是一個指針變量,傳遞的時候也是值傳遞,復制的也是指針本身,
  //但是怪就怪在指針操作的是一個Draw對象,不管哪一個指針,操作的
  //都是Draw對象。所以屬性改變是理所當然瞭

  //3.4遞歸函數
  //3.5內部函數與外部函數
  /*
  內部函數:定義時使用瞭static修飾,隻能被當前源文件中函數調用,所以稱
  為內函數
  外部函數:定義時使用瞭extern修飾,或不使用任何修飾符,他可以被任何源
  文件調用,這種函數叫外部函數,一般函數都是外部函數。
  */
//定義extern函數,省略extern也是允許的
  extern printRect(int height,int width){
      for(int i=0;i<height;i++){
          for(int j=0;j<width;j++){
          printf("*");}
      }
  }
  //3.6局部變量與全局變量
  //不管什麼變量,隻要記住變量的范圍就是在包含它的{}裡面。
  //使用extern把變量變成全局變量
  extern  int globVar;

  //3.7外部全局變量和內部全局變量
  //定義全局變量
  int count = 0;
  //使用外部全局變量
  extern int count;

  //3.8動態存儲與靜態存儲
  void fac(n){
   auto int a = 1;
   static int b = 1;
   a+=n;
   b+=n;
   printf("a的值是%d,b的值是%d\n",a,b);
  }
  //static可以計算階乘
  /*
  int fci_2(n){
  static int f = 1;
  f= f*n
  return f;
  }
  for (int i = 1;i23
     dosomething
   #elif AGE>20
     doOtherThing
   #esle
     doSomeThing
   #endif
  */

  //3.10結構體
  struct 結構體類型名{
   //成員列表
  }
  struct rect{
   int x;
   int y;
   int width;
   int height;
  };
  struct rect rect1;
  //每次都要加struct太麻煩
  #define RECT struct rect

  //3.10typedef語句,謹慎使用啊!
  //一般這兩個情況使用能夠帶來好處
  struct point{
   int x;
   int y;
  };
  typedef struct point YLPoint;

  enum  season{spring,summer,fall,winter};
  typedef enum season YLSeason;
  //然後就可以使用它們定義結構體變量和枚舉變量瞭
  YLPoint p1;
  YLSeason s1;

  //3.11對結構體變量進行初始化
  //可以直接對結構體變量進行初始化
  //這是正確的
  struct rect{
   int x;
   int y;
   int width;
   int height;
  } rect1 = {20,30,100,200};
  //這是錯誤的
  rect1 = {12,20,20,90};

  struct point{
   int x;
   int y;
  };

  typedef  struct point YLPoint;
  //正確的
  YLPoint p1 = {20,10};
  //錯誤的
  p1 = {10,10};
  //正確的
  p1.x = 10;
  p1.y = 10;

  //3.12結構體數組
  YLPoint points[] = {
   {12,10},
   {13,20},
   {34,89}
  };
  //下面的代碼是錯誤的
  points[0] = {12,90};
  //正確的寫法
  points[0].x = 20;
  points[0].y = 30;

  //3.13塊
  /*
   1.定義塊
   //定義不帶參數,無返回值的塊
   void (^printString)(void) = ^(void){
    NSLog(@"無返回值的塊");
   };
   //定義帶參數,有返回值的塊,需要註意的是塊裡面隻需要參數類型而不需要寫形參
   int (^addInt)(int ,int) = ^(int int_a,int int_b){
     return int_a+int_b;
   };
   //塊可以訪問局部變量的值但是不可改變
   int myInt = 20;
   void (^printInt)(void)=^(void){
     myInt = 30;
     NSLog(@"myInt的值是多少%d",myInt);
   };
   myInt = 80;
   printInt();//打印出來的結果是20
   註意:系統在定義塊時,會把局部變量的值保存,而不是等到執行時才去訪問
   所以myInt中值修改後,對塊中的myInt沒有影響。

   如何解決這個問題?使用_block,這樣塊使用的就是變量本身而非它的值
  _block int myInt = 20;
   void (^printInt)(void)=^(void){
     //此處輸出80
     NSLog(@"myInt的值是多少%d",myInt);
     myInt = 30;
     //此處輸出30
     NSLog(@"myInt的值是多少%d",myInt);
   };
   myInt = 80;
   printInt();
   //此處輸出30
   NSLog(@"myInt的值是多少%d",myInt);
   */
   //2.復用塊變量類型
   typedef void (^YLPrintBlock)(int);
   YLPrintBlock printInt = ^(int num){
      printf(num);
   }
   YLPrintBlock printSqrt = ^(int num){
    printf(num*num);
   }
   //3.直接使用Block作為參數
   typedef void (^YLProcessBlock)(int);
   void processArray(int arr[],int lenth,YLProcessBlock process){
           for(int i = 0;i <lenth;i++){
             process(arr[i]);
           }
   }

int main (){
    int arr[] = {2,3,4};
    //傳入塊作為參數調用processArray
    processArray(arr,3,^(int num){
      NSLog(@"元素的平方是多少%d",num*num);
    });
    //printMesg(3,8);
    // int a = 6;
    // int b = 8;
    // swap(a,b);
    //printf("a的值是%d,b的值是%d",a,b);
    int i;
    for (i=0;i<4;i++){
     fac(i);
    }
    return 0;
}

發佈留言