1、数据类型

2、常量

  • 1)凡是整数数字常量一律是 int 型。

  • 2)typedef 和 define。

    	typedef 定义类型,
    #define 只是字符串替换。
  • 3)在编写整形常量时,可以在常量的后面加上符号 L 或者 U 进行修饰。L 表示该常量是长整形,U 表示该常量为无符号整形,字母可以使用大写,也可以使用小写。

    	LongNum = 1000L;                   // L 表示长整形
    UnsignLongNum = 500U; // U 表示无符号整形
    • 在编写实型常量时,可以在常量的后面加上符号 F 或者 L 进行修饰。F 表示该常量是 float 单精度类型,L 表示该常量为 long double 长双精度类型。如果不在后面加上后缀,那么默认情况下,实型常数为 double 双精度类型。例如:
    	FloatNum = 1.2345e2F;              // 单精度类型
    LongDoubleNum = 5.458e-1L; // 长双精度类型
    DoubleNum = 1.2345E2; // 双精度类型

3、变量

  • 1)局部变量定义后,如果没有初始化,其值不一定为 0, 全局变量定义后会自动初始化为 0。

  • 2)char 是整型变量,可以存储数字,而且有 unsigned char。

  • 3)变量类型:

    • 自动变量:auto(可省略)修饰的局部变量。
    • 静态变量:全局变量和被 static 修饰的局部变量。
    • 寄存器变量:regiester 修饰的存储在寄存器中的自动变量。
  • 4)变量存储类别:

    • 自动存储:auto ——> 栈 动态存储变量 auto 是可以省略的,如果不特别指定,局部变量的存储方式默认为自动的(auto)。

    • 静态存储:static ——> 数据段 静态存储变量初始化操作时只在第一次执行时起作用。在随后的运行中变量将保持上一次执行时的值。

      包含全局变量和被 static 修饰的局部变量。

    • 寄存器存储:register ——> 寄存器 存储在寄存器中。

    • 外部声明:extern 只是声明变量,没有开辟存储空间。

      	const 不可变的。
      
      		星前 const,p 可以改变,*p 不可以改变。
      const char *p = &a;
      char const *p = &a; 星后 const,p 不可以改变,*p 可以改变。
      char * const p = &a; volatile 易变的,编译器优化。 extern 只能用来声明外部变量(可省略)(全局变量),不能用来定义外部变量。
      static 用来定义内部变量(全局变量)。
  • 5)变量类型转换:char, short —> int —> unsigned —> long —> double <— float

4、字符串

  • 1)字符串变量在内存中反向排列,先存储后定义的变量。

  • 2)字符串

    	char s[3] = “jhq”,定义的是字符串变量
    char *s = “jhq”, 定义的是字符串常量
  • 3)字符串函数

    	strlen(),字符串中字符的长度计算。 strlen(const char *)
    strcpy(),字符串复制。 strcpy(char *, const char *)
    strcat(),字符串连接。 strcat(char *, const char *)
    strcmp(),字符串比较。 strcmp(const char *, const char *)
    strlwr(),将字符串中大写字母转换成小写字母
    strupr(),将字符串中小写字母转换成大些字母
    strstr(),字符串查找
    strtok(),字符串分割
  • 4)字符 输入/输出:

    • 1>、int getchar();

      • C 标准 I/O 函数中最简单的输入函数。每次只能接收一个字符,可接收转义字符,得到的字符可以赋给整型或字符型变量。

      • 如:cChar = getchar();

    • 2>、int putchar(int ch);

      • C 标准 I/O 函数中最简单的输出函数。每次只能输出一个字符,可输出转义字符。

      • 如:putchar(cChar);

  • 5)字符串 输入/输出:

    • 1>、char *gets(char *str);

      • 将读取的字符串保存到形式参数 str 中,读取过程中直到出现新的一行为止。其中新的一行的换行字符将会转换为字符串中的空终止符 “\0”。

      • 如:char cString[30]; gets(cstring);

    • 2>、int puts(char *str);

      • 输出一个字符串后会自动换行操作,puts 函数会在字符串中判断 “\0” 结束符,遇到结束符时,后面的字符不再输出并且自动换行。

      • 如:puts(“I Love China”);

5、数组

  • 1)数组元素的个数必须为常量或常量表达式,不能是变量。

    • 数组名代表数组的地址,为常量,不可改变。
    • 数组作为函数参数时,如果实参为数组名,将会改变原数组元素的值,形参中可以不写数组元素的个数。
  • 2)数组不初始化时,数组元素的值不确定。

6、指针

  • 1)在同一种编译器环境下,一个指针变量所占用的内存空间是固定的,并不会随所指向变量的类型而改变,16 位下为 2 个字节,32 位下为 4 个字节,64 位下为 8 个字节。

  • 2)指向函数的指针

    	int sum(int a, int b) {
    
    		return a + b;
    } int main(int argc, const char * argv[]) { // 定义指向函数的指针
    int (*p)(int, int); // 指针指向函数
    p = sum; // 调用函数
    // int c = (*p)(5, 6);
    int c = p(5, 6); printf("c = %d", c); return 0;
    }
    	// 定义函数
    
    		// 加法
    int sum(int a, int b){ return a + b;
    } // 减法
    int sub(int a, int b){ return a - b;
    }
    • 1> 指向函数的指针的定义

      	// 定义指向函数的指针 sump,指向函数 sum
      int (*sump)(int, int) = sum; // 调用指向函数的指针(调用函数)
      int sum1 = (*sump)(10, 5); // 调用指向函数的指针(调用函数)
      int sum2 = sump(10, 2);
    • 2> 指向函数的指针类型的定义

      	// 定义 指向函数的指针类型 funp
      typedef int (*funp)(int, int); // 定义 funp 的变量 fun
      funp fun; // 给 funp 的变量 fun 赋值
      fun = sum; // 调用 funp 的变量 fun 所指向的函数,做 加法 预算
      int sumValue = fun(10, 6); NSLog(@"%d", sumValue); // 给 funp 的变量 fun 赋值
      fun = sub; // 调用 funp 的变量 fun 所指向的函数,做 减法 运算
      int subValue = fun(10, 6);

7、结构体

  • 1)结构体在定义时不开辟内存空间,使用时才开辟空间。

  • 2)结构体长度:结构体中的元素存储时按照最长的数据类型长度的整数倍对齐存储,且相邻的元素的原有类型的长度之和小于结构体中最长元素的长度时,相邻的元素对齐到一个最长的数据类型。

8、共用体

  • 1)共用体定义了一块为所有数据成员共享的内存。

  • 2)共用体的长度:所包含的数据成员中最大内存长度的大小。

  • 3)共用体初始化时只需要一个初始化值就够了,其类型必须和共用体的第一个成员的类型相一致。

9、枚举

  • 1)枚举中每个标识符都必须是唯一的,而且不能采用关键字或当前作用域内的其他相同的标识符。

10、运算符

  • 1)运算符:

    • 1> 算术运算符:

      +, -, *, /, %

      • 取模(%)运算符的两侧均为整数

      • 自增运算符 ++

      • 自减运算符 --

      • 在表达式内部,作为运算的一部分,如果运算符放在变量前面,那么变量在参加表达式运算之前完成自增运算或者自减运算;如果运算符放在变量后面,那么变量的自增或者自减运算在变量参加了表达式运算之后完成。

    • 2> 关系运算符:

      >, >=, <, <=, ==, !=

    • 3> 逻辑运算符:

      &&, ||, !

    • 4> 位逻辑运算符:

      &(清零), |(设置), ^(取补), ~(取反)

    • 5> 逗号运算符:

      表达式1,表达式2,……,表达式n

    • 6> 问号运算符(条件运算符):

      表达式1?表达式2:表达式3

      • 在运算中,首先对第一个表达式的值进行检验,如果为真,则返回第二个表达式的结果值,如果为假,则返回第三个表达式的结果值。
    • 7> 复合赋值运算符:

      +=, -=, *=, /=, %=

      • 对于简单赋值运算符,如 Func = Func + 1 中,表达式 Func 计算两次;对于复合赋值运算符 Func += 1 中,表达式 Func 仅计算一次。一般来说这种区别对于程序的运行没有太大的影响,但是如果表达式中存在某个函数的返回值,那么函数被调用两次。
  • 2)短路运算:

    • && 运算 短路与运算:第一个表达式的值为假,不再运算第二个表达式的值。
    • || 运算 短路或运算:第一个表达式的值为真,不再运算第二个表达式的值。
  • 3)运算注意精度上升/下降,优先级,边界。

  • 4)截断:长整型数据赋值给短整型变量时会发生截断,即保留低位,舍去存不下的高位。

    • 扩展:短整型数据赋值给长整型变量时发生扩展,正数高位补 0,负数高位补 1。
  • 5)float (单精度浮点),double (双精度浮点)通常使用没区别,不过 float 赋值给 double 精度不会提升,double 赋值给 float,精度会下降。

  • 6)不同类型的数据进行数学运算,遵从以下原则:

    • 不同类型的数据要先转化为同一类型,然后进行运算:

    char, short —> int —> unsigned —> long —> double <— float

    • 短字节向长字节看齐 int + char = int
    • 有符号向无符号看齐
    • 整型向浮点看齐 int + float = float 3 *‘a’+ 4.6f = 295.6f(float)
    • 单精度向双精度看齐
  • 7)

    	continue: 	结束一次循环
    break: 结束当前循环
    return: 结束一个函数
    exit: 结束整个程序
  • 8)转移语句

    • 1>、goto 语句

      • goto 标识符;

      • 标识符: 程序语句;

      • goto 语句为无条件转移语句,可以使程序立即跳转到函数内部的任意一条可执行语句。

      • 跳转的方向可以向前,也可以向后,可以跳出一个循环,也可以跳入一个循环。

    • 2>、break 语句

      • break;

      • break 语句终止并跳出循环,继续执行后面的代码。

      • break 语句不能用于循环语句和 switch 语句之外的任何其它语句中。

    • 3>、continue 语句

      • continue;

      • continue 语句结束本次循环,即跳过循环体中尚未执行的部分,返回到循环头部继续执行下一次的循环操作。

      • continue 语句只结束本次循环,而不是终止整个循环的执行;break 语句则是结束整个循环过程,不再判读执行的条件是否成立。

  • 9)在 for 语句中的表达式 1 和表达式 3 处,除了可以使用简单的表达式外,还可以使用逗号表达式。

  • 10)switch 语句的检验条件必须是一个整形表达式,其中可以包含运算符和函数调用,case 语句的检验值必须是一个整形常量,可以是常量表达式或常量运算。其中任意两个 case 语句都不能使用相同的常量值。

    • 如果没有一个 case 语句后面的值能匹配 switch 语句的条件,就执行 default 语句后面的代码。并且每一个 switch 结构只能有一个 default 语句,而且 default 可以省略。

11、表达式

  • 1)由运算符和变量、常量共同组成表达式。如 a 6 a + 3 5 - 2 a / b + 3

  • 2)审视一个表达式分两步

    • 1> 看表达式的功能
    • 2> 看表达式的值

12、函数

  • 1)printf 函数,输出控制符:

    	.2 输出 2 位小数,
    2 输出的数据左边空 2 位,
    -2 输出的数据右边空 2 位。
  • 2)scanf 函数,两个输入控制符之间如果是空格或什么也没有,在输入数据时可以用空格、tab 键或回车键区分输入的数据。如果两个输入控制符之间有字符,则在输入数据时需要用相同的字符区分不同的数据。

  • 3)sizeof(),计算数据占用的字节长度,可以是 sizeof(int),sizeof(a),sizeof(10),char d =‘A’ sizeof(d) (计算字符型数据的字节数)。

  • 4)

    • extern 用来修饰(定义或声明)外部函数(可省略)。static 用来修饰(定义或声明)内部函数。
    • extern 只能用来声明外部变量(可省略)(全局变量),不能用来定义外部变量。static 用来定义内部变量(全局变量)。

13、预处理

  • 1)预处理

    • 宏定义可以定义常量或表达式。

    • 条件编译在程序编译之前处理,判断条件不能是变量,可以是宏定义的内容。

    • 文件包含中尖括号只能包含系统自带的库文件,双引号包含自定义的文件也可包含系统自带的库文件。

14、编译

  • 1)c 语言中同一个工程中不能出现相同名字的函数。

    .c — 编译 —> .obj — 链接 —> .exe

    • 编译过程中不同的 .c 文件单独编译成 .obj 的目标文件,链接过程中不同的 .obj 文件与 c 语言库文件链接成 .exe 文件,此过程中会检查函数的唯一性,如果有相同名称的函数会产生链接错误。

15、内存管理

  • 1)内存数据,不看怎么存,只看怎么读。

  • 2)在实际开发中,声明一个无符号数,往往表示这个变量存储的数据理应是正数,如文件大小,工程进度等。但没有强制的约束力。

iOS - C 基本语法的更多相关文章

  1. iOS - OC 面向对象语法

    1.类 1)根类:因为类 NSObject 是层次结构的最顶层,因此称为根类. 可以将类称为子类(subclass)和父类(superclass),也可以将类称为子类和超类. 2)分类/类别(cate ...

  2. iOS - Swift 面向对象语法

    1.面向对象 面向过程:面向过程编成将所要解决的问题按解决问题的步骤进行分析.如果是大问题,就分解成为多个不同的小问题,在程序里叫做划分成不同的模块.每一个解决的步骤可能是一行或者几行代码,也可能是一 ...

  3. iOS开发swift语法0基础篇—————(swift技术交流群:361513739)

    iOS开发之swift语法0基础篇:点击打开链接  swift技术交流QQ群361513739

  4. ios waxpatch lua语法

    Wax Lua 使用方法 说一下 Wax 的特点,它支持你在脚本里使用任何 OC 的类,同样也支持你创建一个类. 使用一个类时你会这样使用: 1 2 NSString -- Returns the N ...

  5. iOS - OC 基本语法

    1.常见文件扩展名 .c C 语言源文件 .cc..cpp C++ 语言源文件 .m Objective-C 源文件 .mm Objective-C++ 源文件 .h 头文件 .pl Perl 源文件 ...

  6. iOS - Swift 基本语法

    前言 Swift 全面支持 Unicode 符号. Swift 中的定义和实现是在同一个单元中的,通常一个 Swift 源代码单文件是以 ".Swift" 结尾的. Swift 不 ...

  7. ios之点语法

    第一个object c 程序 首先新建一个项目,“create a new Xcode project"-"OS X下的Application"-"Comman ...

  8. iOS: 布局可视化语法 Visual Format Syntax

    可视化语法 Visual Format Syntax The following are examples of constraints you can specify using the visua ...

  9. ios结构体语法

  10. iOS开发——高级语法篇&继承、实现、依赖、关联、聚合、组合的联系与区别

    继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者 ...

随机推荐

  1. jQuery获取一般处理程序(ashx)的JSON数据

    昨天有在开发的软件生产线生产流程,RFID扫描IC卡的数据,当中有用到jQuery获取一般处理程序(ashx)的JSON数据.今有把它写成一个小例子,望需要的网友能参考. 在网站中,创建一个一般应用程 ...

  2. Python开发【第九章】:线程、进程和协程

    一.线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 1.t ...

  3. 开发不改bug?给你支个招

    在测试过程中,不免会遇到开发人员因为一些原因不想修改个别bug的情况.那一般遇到这种问题时,我们该如何去推进开发修改bug呢? 我们先来分析下到底会有哪些原因会导致开发不修改bug 1. 开发与测试对 ...

  4. linux环境下配置java WEB项目运行环境,jdk8+tomcat8+mysql5.7.11 新手向

    一:安装jdk 1.下载jdk  在oracle下载东西的时候因为oracle的一些验证机制,所以需要在链接前面添加一些参数 wget --no-check-certificate --no-cook ...

  5. 写在开始编写Java之前(2)——Java的环境

    上回说到Java具有跨系统性的特点 但是每个系统还是有其Java虚拟机,叫做JVM 其中Java运行环境(JRE)中就包括了JVM 假如你只要运行已经编辑好的Java语句,只要下载JRE就行了 但是作 ...

  6. STL之优先队列(1)

    优先队列用法 在优先队列中,优先级高的元素先出队列. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系. 优先队列的第一种用法: 也是最常用的用法 priority_queue< ...

  7. java权限修饰符

  8. 基于eBox的LTC1446驱动

    LTC1446 是linear出品的双通道12bit轨对轨DAC芯片,采用SPI接口,内部基准电压,满量程输出4.095v,单电源供电(4.5-5v).8Pin封装.            使用时非常 ...

  9. java多线程编程--基础篇

    一.基本概念 a.操作系统中进程与线程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间, 一个进程中可以启动 ...

  10. TypeError: unsupported operand type(s) for |: 'str' and 'str'

    问题描述: