IOS入门教程(三)-C语言特性

//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;i<8;i++){
   fci_2(8);
  }
  */

  /*3.9预处理,我个人觉得很重要
  1.普通宏
  #define PI 3.1415926
  2.带参数的宏
  #define AREA(r) PI*r*R 直接使用前面的宏来定义新的宏
  需要注意的一些问题是
  编译器只是简单的替换 比如AREA(10+2)就会出错
  3.使用#ifdef #ifndef #else #endif执行条件编译
  #define iPad
  #ifdef iPad
    printf("iPad");
  #else
    printf("iPhone");
  #endif

  4.使用#if  #elif #else #endif
   #define AGE 20
   #if AGE>23
     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;
}

时间: 2024-11-07 12:45:07

IOS入门教程(三)-C语言特性的相关文章

BootStrap入门教程 (三)

上讲回顾:Bootstrap的基础CSS(Base CSS)提供了优雅,一致的多种基础Html页面要素,包括排版,表格,表单,按钮等,能够满足前端工程师的基本要素需求. Bootstrap作为完整的前端工具集,内建了大量的强大优雅可重用的组件,包括按钮(Button),导航(Navigation),标签(Labels),徽章(Badges),排版(Typography),缩略图( thumbnails),提醒(Alert),进度条(progress bar),杂项(Miscellaneous).

BootStrap入门教程 (三) :可重用组件(按钮,导航,标签,徽章,排版,缩略图,提醒,进度条,杂项)

上讲回顾:Bootstrap的基础CSS(Base CSS)提供了优雅,一致的多种基础Html页面要素,包括排版,表格,表单,按钮等,能够满足前端工程师的基本要素需求. Bootstrap作为完整的前端工具集,内建了大量的强大优雅可重用的组件,包括按钮(Button),导航(Navigation),标签(Labels),徽章(Badges),排版(Typography),缩略图( thumbnails),提醒(Alert),进度条(progress bar),杂项(Miscellaneous).

study Mvc step by step (三)C#语言特性扩展方法

C#3.0之后推出了扩展方法.我们通常看到的方法都是和声明它的类相关联.扩展方法特性扩展这个边界,允许编写的方法和声明它的类之外的类关联. 要想知道可以如何使用这个特性,请看下面的代码.它包含类MyPerson.该类存贮了3个double类型的值,并含有一个构造函数和一个名称为sum的方法,该方法返回3个存储值得和. using System; using System.Collections.Generic; using System.Linq; using System.Text; usin

Unix/Linux环境C编程入门教程(41) C语言库函数的文件操作详解

?? 上一篇博客我们讲解了如何使用Linux提供的文件操作函数,本文主要讲解使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态. mode有下列几种形态字符串: r 打开只读文件,该文件必须存

jQuery 入门教程(三): Selectors

jQuery Selector 是jQuery库中非常重要的一个组成部分. jQuery Selector 用来选择某个HTML元素,其基本语句和CSS的选择器(Selector)是一样的,所有jQuery selector 都是以$()开始. 选择HTML标记 选择某个HTML元素的方法是直接使用该元素的标记名称,比如选择所有<p>元素 $("p") 下面的例子当用户点击一个按钮时,隐藏所有的<p>元素 $(document).ready(function()

无废话ExtJs 入门教程三[窗体:Window组件]

无废话ExtJs 入门教程三[窗体:Window组件] extjs技术交流,欢迎加群(201926085) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/19

Git的入门教程&lt;三&gt;

Git 的入门教程<三> 4> git远程仓库的使用 续之前的(http://blog.csdn.net/xuheazx/article/details/43229781) 4.2 git远程服务器的搭建 我目前的服务器版本: Linux hehe.xu 2.6.32-358.el6.i686 #1 SMP Thu Feb 21 21:50:49 UTC 2013 i686 i686 i386 GNU/Linux 因为是为了做教程,所以采用的是虚拟机来进行搭建git服务器. 4.2.1

PySide——Python图形化界面入门教程(三)

PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widgets,以及将他们布局的两种不同的方法.今天我们继续讨论Python/Qt应用响应用户触发的事件:信号和槽. 当用户执行一个动作——点击按钮,选择组合框的值,在文本框中打字——这个widget就会发出一个信号.这个信号自己什么都不做,它必须和槽连接起来才行.槽是一个接受信号的执行动作的对象. 连接内建P

RabbitMQ入门教程(三):Hello World

原文:RabbitMQ入门教程(三):Hello World 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/78583480 分享一个朋友的人工智能教程(请以"右键"->"在新标签页中打开连接"的方式访问).比较通俗易懂,风趣幽默,感兴趣的朋友可以去看看. Hello World示例功能简介 功能描述

Elasticsearch入门教程(三):Elasticsearch索引&amp;映射

原文:Elasticsearch入门教程(三):Elasticsearch索引&映射 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/vbirdbest/article/details/79213163 索引概念简介 通常说的索引有两种词性,名称和动词. 动词索引indexing,索引一个文档,表示把一个文档存储到索引Index里,可以用来查询和检索,es采用倒排索引 名词索引index,