IOS开发之路--C语言基础知识

概览

当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发:

C语言 OC基础 IOS开发(iphone/ipad) Swift

这么看下去还有大量的内容需要持续补充,但是今天我们从最基础的C语言开始,C语言部分我将分成几个章节去说,今天我们简单看一下C的一些基础知识,更高级的内容我将放到后面的文章中。

今天基础知识分为以下几点内容(注意:循环、条件语句在此不再赘述):

Hello World
运行过程
数据类型
运算符
常用函数

Hello World

既然是IOS开发系列首先看一下在Mac OS X中的C的运行

打开Xcode

选择命令行程序

填写项目名称并选择使用C语言

选择保存目录

自动生成如下代码

OK,在Xcode上我们编写自己的程序如下

//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#include <stdio.h>

void showMessage(){
  printf("Hello,World!\n");
}

int main(int argc, const char * argv[]) {
  showMessage();
  return 0;
}

在上面的程序中我们需要解释几点:

main函数是程序入口,一个程序只能有一个main()函数,需要有一个整型返回值(事实上返回值int可以省略,但是这并不代表不返回值,而是默认为int;我们也可以在main()函数中不提供return,这是因为c语言语法要求不够严格); #include是预处理指令,用于包含指定文件(注意在编译前即处理),它实际做的工作就是把对应文件复制到指定的位置; 包含的内容可以是任何类型的文件,而不仅仅是.h文件; 上面的showMessage函数必须写在main()函数上面,如果写在下面则必须在main()函数之前声明;

注意:#include 包含文件时有两种方式:使用<>和””。区别就是<>包含只会查找编译器库函数文件,因此适用于包含库函数;而“”包含则首先查找程序当前目录,如果没有找到则查找库函数路径,因此适用于自定义文件;

运行过程

C语言的运行分为两大步:编译和链接

编译:编译阶段会将对应的xxx.c源文件(ASCII格式)编译成目标文件xxx.obj,它是二进制格式(当然一般我们会有多个.c文件,也就会生成多个对应的.obj);在编译之前要进行预处理(例如#include指令),在编译的同时还要进行语法检查;生成的.obj文件并不能单独执行,因为各个.obj之间是有关联的,而且他们还各自引用了C语言库函数; 链接:链接的过程就是将各个.obj文件和C语言库函数一起组合生成一个可执行文件的过程;扩展

在大型项目开发中程序中所有的代码都写到一个文件中是不现实的,我们通常将一个子操作分为两个文件:.c文件和.h文件。在.c文件中实现对应的函数,在.h中进行函数声明,这样只要在主函数上方包含对应的头文件就可以将子操作分离出来而且不用考虑顺序问题。例如改写“Hello World”的例子(注意message对应的.c和.h文件名完全可以不相同,但是出于规范的目的我们还是取相同的文件名):

message.h

//
// Message.h
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//
void showMessage();

message.c

//
// Message.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#include <stdio.h>

void showMessage(){
  printf("Hello,World!\n");
}

main.c

//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#include <stdio.h>
#include "Message.h"

int main(int argc, const char * argv[]) {
  showMessage();
  return 0;
}

可以发现程序仍然可以正常运行,但是我们思考一个问题:如果我们不分成两个文件,直接在主函数文件中包含message.c是否也可以正常运行呢?答案是否定的,原因是由于编译生成的两个文件main.obj和 message.obj在链接时会发现main.obj中已经有message.obj中定义的showMessage函数,抛出“标示符重复”的错误。

数据类型

类型修饰符

从上图我们可以清晰的看到C语言的数据类型结构,当然对于这些类型我们还有一些类型修饰符(或叫限定符)

short 短型 ,修饰int、double long 长型,修饰int、double signed 有符号型,修饰int、char unsigned 无符号型,修饰int、char

对于类型修饰符需要做如下解释

这些修饰符经常用来修饰int型,在修饰int类型时int可以省略; short和long会改变int型的长度,不同编译器项长度不相同,但是short长度不大于int,int长度不大于long; singed、unsigned不改变类型长度,仅仅表示最高位是否为符号位,signed表示大于等于0的正数;

当然有时候我们必须清楚每个类型占用的字节,下表列出常用数据类型占用的存储空间

注意:char类型是最小的数据类型单位,在任何类型的编译器下都是占用1个字节,char类型的变量赋值可以直接赋值等于某个字符也可以赋值为整数(对应的ASCII值)。

运算符

C语言中有34中运算符,同C#、Java等语言没有太大的区别,这里指列出一些注意事项

关系运算符为真就返回1,为假就返回0;在条件语言中非0即真(负数、正数均为真),只有0为假 ; C语言可以不保存关系运算符的值 ; 逗号表达式最终的值是最后一个表达式的值;

针对上面几点看以下例子

//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
  int a=2>1,b=2<1,c=99,d=0;
  int f=0,g=0,h=0,e=(f=3,g=4,h=5);

  a>0;//没有保存运算结果

  printf("%d,%d\n",a,b);//结果:1,0

  if(c){//可以通过
    printf("true.\n");
  }
  if(d){//无法通过
    printf("false\n");
  }

  printf("%d\n",e);//结果:5
  return 0;
}

常用函数printf()函数

printf()函数用于向标准输出设备输出数据,配合格式符可以完成强大的输出功能,上面的例子中我们已经使用了这个函数。

通常我们的输出不是固定内容而是包含某些变量,此时需要用到格式符,常用格式符如下

对于格式符的输出宽度和浮点数的小数位我们可以进行精确的控制

//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
  int a=16;
  float b=79.3f;
  printf("[a=%4d]\n",a);
  printf("[a=%-4d]\n",a);
  printf("[b=%10f]\n",b);
  printf("[b=%.2f]\n",b);
  printf("[b=%4.2f]\n",b);
  return 0;
}

运行结果如下

从运行结果我们不难发现格式符%前的正数可以设置前端补齐,负数设置后端对齐,如果数据的总长度超过设置的修饰长度,则按照实际长度显示;小数点后的整数用于控制小数点后保留小数位的长度。

scanf()函数

scanf()函数用于从标准输入设备接收输入数据

//
// main.c
// C语言基础
//
// Created by Kenshin Cui on 14-7-12.
// Copyright (c) 2014年 cmjstudio. All rights reserved.
//

#include <stdio.h>

int main(int argc, const char * argv[]) {
  int a,b,c;
  scanf("%d,%d,%d",&a,&b,&c);//此时需要输入:1,2,3 然后回车
  printf("a=%d,b=%d,c=%d\n",a,b,c);
  return 0;
}

对于scanf()函数我们需求强调几点

参数接收以回车进行结束操作 如果需要接收多个参数,多个参数之间的分隔符是任意的,但是如果分隔符是“空格”则实际输入的时候分隔符可以使空格、tab和回车(最后一个回车认为是结束符)

(0)

相关推荐

  • IOS开发之路--C语言构造类型

    概述 在第一节中我们就提到C语言的构造类型,分为:数组.结构体.枚举.共用体,当然前面数组的内容已经说了很多了,这一节将会重点说一下其他三种类型. 结构体 枚举 共用体 结构体 数组中存储的是一系列相同的数据类型,那么如果想让一个变量存储不同的数据类型就要使用结构体,结构体定义类似于C++.C#.Java等高级语言中类的定义,但事实上它们又有着很大的区别.结构体是一种类型,并非一个变量,只是这种类型可以由其他C语言基本类型共同组成. // // main.c // ConstructedType

  • iOS开发基础之C语言

    为何学习iOS开发要先学C语言呢,学习c语言对ios开发有何作用. 现在越来越多的iOS开发兴趣爱好者投入到了iOS培训中,有的是已经在职的员工,有的是还在就读的学生,还有一些是完全零基础的同学,那么对于他们来说就要一切从基础开始学,首先从C语言学起. 因为C语言是一门语言基础,因具备简洁.灵活等特点而被广泛应用,在多种开发环境中都起着重要作用.那么,为什么学习iOS开发要先学C语言呢? 因为在iOS开发中,会经常使用C语言和汇编的,而汇编语言相对而言要生涩繁琐些,C语言因此便成为程序员的首选.

  • IOS开发之路--C语言指针

    概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 数组和指针 函数指针 什么是指针 存放变量地址的变量我们称之为"指针变量",简单的说变量p中存储的是变量a的地址,那么p就可以称为是指针变量,或者说p指向a.当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对应的存储空间中拿到a的值,这种方式我们称之为"直接

  • IOS开发之路--C语言数组和字符串

    概览 数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等.而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符串数组.今天主要就介绍如下三个方面: 一维数组 多维数组 字符串 一维数组 一维数组操作比较简单,但是需要注意,数组长度必须是固定的,长度不能使用变量进行初始化:如果声明的同时进行赋值则数组长度可以省略,编译器会自动计算数组长度:同时数组不能先声明再一次性赋值(当然可以对每个元素一一赋值). #include <stdi

  • IOS开发之路--C语言存储方式和作用域

    概述 基本上每种语言都要讨论这个话题,C语言也不例外,因为只有你完全了解每个变量或函数存储方式.作用范围和销毁时间才可能正确的使用这门语言.今天将着重介绍C语言中变量作用范围.存储方式.生命周期.作用域和可访问性. 变量作用范围 存储方式 可访问性 变量作用范围 在C语言中变量从作用范围包括全局变量和局部变量.全局变量在定义之后所有的函数中均可以使用,只要前面的代码修改了,那么后面的代码中再使用就是修改后的值:局部变量的作用范围一般在一个函数内部(通常在一对大括号{}内),外面的程序无法访问它,

  • IOS开发之路--C语言预处理

    概述 大家都知道一个C程序的运行包括编译和链接两个阶段,其实在编译之前预处理器首先要进行预处理操作,将处理完产生的一个新的源文件进行编译.由于预处理指令是在编译之前就进行了,因此很多时候它要比在程序运行时进行操作效率高.在C语言中包括三类预处理指令,今天将一一介绍: 宏定义 条件编译 文件包含 宏定义 对于程序中经常用到的一些常量或者简短的函数我们通常使用宏定义来处理,这样做的好处是对于程序中所有的配置我们可以统一在宏定义中进行管理,而且由于宏定义是在程序编译之前进行替换相比定义成全局变量或函数

  • IOS开发之路--C语言基础知识

    概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift 这么看下去还有大量的内容需要持续补充,但是今天我们从最基础的C语言开始,C语言部分我将分成几个章节去说,今天我们简单看一下C的一些基础知识,更高级的内容我将放到后面的文章中. 今天基础知识分为以下几点内容(注意:循环.条件语句在此不再赘述): Hello World 运行过程 数据类型 运算符 常用

  • 模块一 GO语言基础知识-库源码文件

    你已经使用过 Go 语言编写了小命令(或者说微型程序)吗? 当你在编写"Hello, world"的时候,一个源码文件就足够了,虽然这种小玩意儿没什么用,最多能给你一点点莫名的成就感.如果你对这一点点并不满足,别着急,跟着学,我肯定你也可以写出很厉害的程序. 我们在上一篇的文章中学到了命令源码文件的相关知识,那么除了命令源码文件,你还能用 Go 语言编写库源码文件.那么什么是库源码文件呢? 在我的定义中,库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他

  • C语言基础知识分享续篇

    目录 写在前面 数组 数组使用 函数 字符串 strlen && sizeof sizeof strlen 转义字符 操作符 选择语句 if else switch 循环语句 for while do while 跳出语句 contine break 指针 自定义类型 struct 写在前面 好了,现在我们开始C语言的第二个部分.今天我们需要看下面几个知识点,都是非常简单的,我们主要认识一下. 数组 我们知道一个一个属性可以用一个类型去表示,那么我想问的是如果是一个属性的多个呢?也就是多个

  • iOS开发之路--微博“更多”页面

    最终效果图: MoreViewController.m // // MoreViewController.m // 20_帅哥no微博 // // Created by beyond on 14-8-4. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "MoreViewController.h" @interface MoreViewController () { // more.plist根是字典

  • iOS开发之路--微博新特性页面

    BeyondAppDelegate.m // // BeyondAppDelegate.m // 20_帅哥no微博 // // Created by beyond on 14-8-3. // Copyright (c) 2014年 com.beyond. All rights reserved. // #import "BeyondAppDelegate.h" #import "BeyondViewController.h" #import "NewFe

随机推荐