iOS开发系列--C语言之基础知识

简介:

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

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

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

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

  1. Hello World
  2. 运行过程
  3. 数据类型
  4. 运算符
  5. 常用函数

Hello World

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

打开Xcode

Xcode

选择命令行程序

CommandLine

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

ProjectName

选择保存目录

SaveFolder

自动生成如下代码

Project

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;
}

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

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

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

运行过程

image

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函数,抛出“标示符重复”的错误。

identityRepeat

数据类型

image

类型修饰符

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

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

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

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

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

存储空间

注意:char类型是最小的数据类型单位,在任何类型的编译器下都是占用1个字节,char类型的变量赋值可以直接赋值等于某个字符也可以赋值为整数(对应的ASCII值);可以使用两个long来修饰一个整形(就是经常使用的8字节的整形long long),但是两个long不能修饰double而且也不存在两个short,否则编译警告;一个浮点型常量如果后面加上f编译器认为它是float类型,否则认为double类型,例如10.0是double类型,10.0f是float类型。

运算符

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

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

针对上面几点看以下例子

//
//  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;
}

运行结果如下

runResult

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

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()函数我们需求强调几点

  1. 参数接收以回车进行结束操作
  2. 如果需要接收多个参数,多个参数之间的分隔符是任意的,但是如果分隔符是“空格”则实际输入的时候分隔符可以使空格、tab和回车(最后一个回车认为是结束符)
目录
相关文章
|
1月前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
10天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
96 66
|
21天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
25天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
28天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
46 6
|
27天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
1月前
|
存储 安全 物联网
C语言物联网开发之设备安全与代码可靠性隐患
物联网设备的C语言代码安全与可靠性至关重要。一是防范代码安全漏洞,包括缓冲区溢出和代码注入风险,通过使用安全函数和严格输入验证来预防。二是提高代码跨平台兼容性,利用`stdint.h`定义统一的数据类型,并通过硬件接口抽象与适配减少平台间的差异,确保程序稳定运行。
|
26天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
43 1
|
26天前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
43 1
|
26天前
|
传感器 存储 物联网
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点
在物联网(IoT)快速发展的今天,C语言作为物联网开发中的关键工具,以其高效、灵活、可移植的特点,广泛应用于嵌入式系统开发、通信协议实现及后端服务构建等领域,成为推动物联网技术进步的重要力量。
35 1