第3章、嵌入式Linux C语言高级用法

Size: px
Start display at page:

Download "第3章、嵌入式Linux C语言高级用法"

Transcription

1 在上在本中, 读者将会学习嵌入式 Linux C 语言的高级用法, 这些在使用嵌入式 Linux C 开发的应用程序中是比较常见的 另外, 本也会讲解一些有关嵌入式 Linux C 程序可移植性问题 C 语言与汇编语言之间的混合编程 本主要内容 q 预处理 q C 语言中的内存分配 q 程序的可移植性考虑 嵌入式 Linux C 语言高级用法 q C 和汇编的接口

2 预处理 在本书的 2 中, 已介绍过编译过程中的预处理阶段 所谓预处理是指在进行编 译的一遍扫描 ( 词法扫描和语法分析 ) 之前所做的工作 预处理是 C 语言的一个重要 功能, 它由预处理程序负责完成 当编译一个程序时, 系统将自动调用预处理程序对程 序中以 # 号开头的预处理部分进行处理, 处理完毕后就可以进入源程序的编译阶段 C 语言提供了多种预处理功能, 如宏定义 文件包含 条件编译等 合理地使用预 处理功能编写的程序既便于阅读 修改 移植和调试, 也有利于模块化程序设计 本节 介绍最常用的几种预处理功能.1.1 预定义 在 C 语言源程序中允许用一个标识符来表示一串符号, 称为宏, 被定义为宏的标识 符称为宏名 在编译预处理时, 对程序中所有出现的宏名, 都用宏定义中的符号串去替 换, 这称为宏替换或宏展开 1. 预定义符号 在 C 语言中, 有一些预处理定义的符号串, 它们的值或者是字符串常量, 或者是十 进制数字常量, 通常在调试程序时用于输出源程序的各项信息, 如表.1 所示归纳了这 些预定义符号 表.1 预定义符号表 符号示例含义 FILE /home/david/hello.c 正在预编译的源文件名 LINE 5 文件当前行的行号 FUNCTION main 当前所在的函数名 DATE Mar 预编译文件的日期 TIME 2:04:12 预编译文件的时间 STDC 1 如果编译器遵循 ANSI C, 则值为 1 这些预定义符号通常可以在程序出错处理时应用 下面的程序显示了这些预定义符 号的基本用法 : int main() printf("the file is %s\n", FILE ); printf("the line is %d\n", LINE ); printf("the function is %s\n", FUNCTION ); printf("the date is %s\n", DATE ); 2

3 嵌入式 Linux C 语言高级用法 printf("the time is %s\n", TIME ); 要注意的是, 这些预定义符号中 LINE 和 STDC 是整数常量, 其他都是字符串常量, 该程序的输出结果如下所示 : The file is /home/david/hello.c The line is 5 The function is main The date is Mar The time is 2:08:42 2. 宏定义 以上是 C 语言中自带的预定义符号, 除此之外, 用户自己也可以编写宏定义 宏定 义是由源程序中的宏定义 #define 语句完成的 ; 而宏替换是由预处理程序自动完成的 在 C 语言中, 宏分为带参数和不带参数两种, 下面分别讲解这两种宏的定义和使用 1) 无参宏定义 无参宏的宏名 ( 也就是标识符 ) 后不带参数, 其定义的一般形式为 : #define 标识符字符串 # 表示这是一条预处理命令, 凡是以 # 开头的均为预处理命令 define 为宏定义命令 标识符为所定义的宏名 字符串可以是常数 表达式 格式串等 在前面介绍过的符号常量的定义就是一种无参宏定义 此外, 用户还可对程序中反 复使用的表达式进行宏定义, 例如 : #define M (y + ) 这样就定义了 M 的表达式为 (y + ), 在此后编写程序时, 所有的 (y + ) 都可由 M 代 替 而对源程序进行编译时, 将先由预处理程序进行宏代换, 即用 (y + ) 表达式去替换 所有的宏名 M, 然后再进行编译 : #define M (y + ) void main() int s, y; printf("input a number: "); scanf("%d", &y); s = 5 * M; printf("s = %d\n", s); 在上例程序中首先进行宏定义, 定义 M 表达式 (y + ), 在 s = 5 * M 中进行了宏 调用, 在预处理时经宏展开后该语句变为 : s = 5 *(y + ) 1

4 这里要注意的是, 在宏定义中表达式 (y + ) 两边的括号不能少, 否则该语句展开后 就成为如下形示 : s = 5 * y + 这样显然是错误的, 通常把这种现象叫做宏的副作用 对于宏定义还要说明以下几点 (1) 宏定义用宏名来表示一串符号, 在宏展开时又以该符号串取代宏名, 这只是一 种简单的替换, 符号串中可以包含任何字符, 可以是常数, 也可以是表达式, 预处理程 序对它不做任何检查 如有错误, 只能在编译已被宏展开后的源程序时发现 (2) 宏定义不是声明或语句, 在行末不必加分号, 如加上分号则连分号也一起替换 () 宏定义的作用域包括从宏定义命名起到源程序结束, 如要终止其作用域, 可使 用 #undef 命令来取消宏作用域, 例如 : #define PI func1() #undef PI func2() /* 表示 PI 只在 func1() 函数中有效, 在 func2() 函数中无效 */ (4) 宏名在源程序中若用引号括起来, 则预处理程序不对其进行宏替换 : #define OK 100 main() printf("ok"); 上例中定义宏名 OK 表示 100, 但在 printf 语句中 OK 被引号括起来, 因此不做宏替换 (5) 宏定义允许嵌套 在宏定义的符号串中可以使用已经定义的宏名, 在宏展开时 由预处理程序层层替换 (6) 习惯上宏名用大写字母表示, 以便与变量区别, 但也允许用小写字母表示 (7) 对输出格式做宏定义, 可以减少编写麻烦, 例如 : #define P printf #define D "%d\n" #define F "%f\n" void main() int a = 5, c = 8, e = 11; float b =.8, d = 9.7, f = 21.08; P(D F, a, b); P(D F, c, d); P(D F, e, f); 4

5 嵌入式 Linux C 语言高级用法 2) 带参宏定义 C 语言允许宏带有参数, 在宏定义中的参数称为形式参数, 在宏调用中的参数称为实际参数 对带参数的宏, 在调用中不仅要宏展开, 而且要用实参去替换形参 带参宏定义的一般形式为 : #define 宏名 ( 形参表 ) 字符串 在字符串中含有各个形参 带参宏调用的一般形式为 : 宏名 ( 实参表 ); 例如 : #define M(y) y + /* 宏定义 */ 若想调用以上宏, 可以采用如下方法 : K = M(5); /* 宏调用 */ 在宏调用时, 用实参 5 代替宏定义中的形参 y, 经预处理宏展开后的语句为 : K = 5 + 以下这段程序就是常见的比较两个数大小的宏表示 : #define MAX(a,b) (a > b)?a:b /* 宏定义 */ void main() int x = 10, y = 20, max; max = MAX(x, y); /* 宏调用 */ printf("max = %d\n", max); 上例程序的一行进行带参宏定义, 用宏名 MAX 表示条件表达式 (a > b)?a:b, 形参 a b 均出现在条件表达式中 在程序中 max = MAX(x, y); 为宏调用, 实参 x y 将替换形参 a b 宏展开后该语句为 max = (x > y)?x:y;, 用于计算 x y 中的大数 由于宏定义非常容易出错, 因此, 对于带参的宏定义有以下问题需要特别说明 (1) 在带参宏定义中, 宏名和形参表之间不能有空格出现 例如 : #define MAX(a, b) (a > b)?a:b 写为 : #define MAX (a, b) (a > b)?a:b 这将被认为是无参宏定义, 宏名 MAX 代表字符串 (a, b) (a > b)?a:b 宏展开时, 宏 调用语句 max = MAX(x, y); 将变为 max = (a, b) (a > b)?a:b(x, y);, 这显然是错误的 (2) 在带参宏定义中, 形式参数不分配内存单元, 因此不必做类型定义 这与函数 中的情况有所不同 在函数中, 形参和实参是两个不同的量, 各有自己的作用域, 调用 时要把实参值赋予形参, 进行值传递 而在带参宏中, 只是符号替换, 不存在值传递的 问题 1 5

6 () 在宏定义中的形参是标识符, 而宏调用中的实参可以是表达式, 例如 : #define SQ(y) (y)*(y) /* 宏定义 */ sq = SQ(a+1); /* 宏调用 */ 上例中一行为宏定义, 形参为 y; 而在宏调用中实参为 a+1, 是一个表达式, 在宏 展开时, 用 a + 1 替换 y, 再用 (y) * (y) 替换 SQ, 得到如下语句 : sq=(a+1)*(a+1); 这与函数的调用是不同的, 函数调用时要把实参表达式的值求出来再赋予形参, 而 宏代换中对实参表达式不进行计算直接照原样替换 (4) 在宏定义中, 字符串内的形参通常要用括号括起来以免出错 在上例中的宏定义中 (y) * (y) 表达式的 y 都用括号括起来, 因此结果是正确的 如果 去掉括号, 把程序改为以下形式 : #define SQ(y) y * y /* 宏定义无括号 */ sq = SQ(a + 1); /* 宏调用 */ 这是由于替换只做简单的符号替换而不做其他处理造成的, 在宏替换之后将得到以 下语句 : sq = a + 1 * a + 1; 这显然与题意相违背, 因此参数两边的括号是不能少的 其实, 宏定义即使在参数两边加括号还是不够的, 例如 : #define SQ(y) (y) * (y) /* 宏定义有括号 */ sq = 160 / SQ(a + 1); /* 宏调用依然出错 */ 读者可以分析一下宏调用语句, 在宏替换之后变为 : sq = 160 / (a + 1) * (a + 1); 由于 / 和 * 运算符优先级及结合性相同, 所以先计算 160 / (a + 1), 再将结果 与 (a + 1) 相乘, 所以程序运行的结果依然是错误的 那么, 究竟怎样进行宏定义才是正 确的呢? 下面是正确的宏定义 : #define SQ(y) ((y) * (y)) /* 正确的宏定义 */ sq = 160 / SQ(a + 1); /* 宏调用结果正确 */ 以上讨论说明, 对于宏定义不仅应在参数两侧加括号, 还应在整个符号串外加括号 带参宏和带参函数很相似, 但有本质上的不同 除上面已谈到的各点外, 把同一表 达式用函数处理与用宏处理的结果有可能是不同的 例如有以下两段程序, 一个程序是采用调用函数的方式来实现的 : /* 程序 1, 函数调用 */ int SQ(int y) /* 函数定义 */ Return (y * y); 6

7 嵌入式 Linux C 语言高级用法 void main() int i = 1; while (i <= 5) printf("%d ", SQ(i++)); /* 函数调用 */ 二个程序是采用宏定义的方式来实现的 : /* 程序 2, 宏定义 */ #define SQ(y) ((y)*(y)) /* 宏定义 */ void main() int i = 1; while (i <= 5) printf("%d ", SQ(i++)); /* 宏调用 */ 可以看到, 不管是形参 实参还是具体的表达是都是一样的, 但运行的结果却截然 不同函数调用的运行结果为 : 而宏调用的运行结果却是 : 这是为什么呢? 请读者先自己思考, 再看下面的分析 在一个程序中, 函数调用是把实参 i 的值传给形参 y 后自增 1, 然后输出函数值, 因而要循环 5 次, 输出 1~5 的平方值 在二个程序中, 宏调用时实参和形参只做会换, 因此 SQ(i++) 被替换为 ((i++) * (i++)) 在一次循环时, 由于在其计算过程中 i 值一直为 1, 两相乘的结果为 1, 然后 i 值两次自增 1, 变为 在二次循环时,i 值已有初值为, 同理相乘的结果为 9, 然后 i 再两次自增 1 变为 5 进入 次循环, 由于 i 值已为 5, 所以这将是最后一次循环 相乘的结果为 25 i 值再两次自增 1 变为 7, 不再满足循环条件, 停止循环 从以上分析, 可以看出, 函数调用和宏调用在形式上相似, 但在本质上是完全不同 的, 如表.2 所示总结了宏与函数的不同之处 表.2 宏与函数的不同之处 属性 #define 宏函数 处理阶段预处理阶段, 只是符号串的简单的替换编译阶段 代码长度 每次使用宏时, 宏代码都被插入到程序中 因此, 除了非常小的宏之外, 程序的长度都将被大幅增长 ( 除了 inline 函数之外 ) 函数代码只出现在一个地方, 每次使用这个函数, 都只调用那个地方的同一份代码 1 7

8 续表 属性 #define 宏函数 执行速度更快存在函数调用 / 返回的额外开销 (inline 函数除外 ) 操作符优先级 参数求值 参数类型 宏参数的求值是在所有周围表达式的上下文环境中, 除非它们加上括号, 否则邻近操作符的优先级可能会产生不可预料的结果 参数每次用于宏定义时, 它们都将重新求值 由于多次求值, 具有副作用的参数可能会产生不可预料的结果 宏与类型无关, 只要对参数的操作是合法的, 它可以适用于任何参数类型 函数参数只在函数调用时求值一次, 它的结果值传递给函数, 因此, 表达式的求值结果更容易预测 参数在函数被调用前只求值一次, 在函数中多次使用参数并不会导致多种求值问题, 参数的副作用不会造成任何特殊的问题 函数的参数与类型有关, 如果参数的类型不同, 就需要使用不同的函数, 即使它们执行的任务是相同的.1.2 文件包含 文件包含是 C 语言预处理程序的另一个重要功能, 文件包含命令行的一般形式为 : #include " 文件名 " 在前面我们已多次用此命令包含过库函数的头文件, 例如 : #include <stdio.h> #include <math.h> 文件包含语句的功能是把指定的文件插入该语句行位置, 从而把指定的文件和当前 的源程序文件连成一个源文件 在程序设计中, 文件包含是很有用的 一个大的程序可 以分为多个模块, 由多个程序员分别编写 有些公用的符号常量 宏 结构 函数等的 声明或定义可单独组成一个文件, 在其他文件的开头用包含命令包含该文件即可使用 这样就可避免在每个文件开头都去写那些公用量, 从而节省时间, 并减少出错 这里, 对文件包含命令还要说明以下几点 (1) 包含命令中的文件名可以用双引号括起来, 也可以用尖括号括起来, 例如以下 写法是允许的 : #include "stdio.h" #include <math.h> 但是这两种形式是有区别的 : 使用尖括号表示在系统头文件目录中去查找 ( 头文件 目录可以由用户来指定 ); 使用双引号则表示首先在当前的源文件目录中查找, 若未找到 才到系统头文件目录中去查找 用户编程时可根据自己文件所在的位置来选择某一种 形式 (2) 一个 include 命令只能指定一个被包含文件 ; 若有多个文件要包含, 则需用多个 include 命令 () 文件包含允许嵌套, 即在一个被包含的文件中又可以包含别的文件 8

9 嵌入式 Linux C 语言高级用法.1. 条件编译 预处理程序提供了条件编译的功能, 可以按不同的条件去编译不同的程序代码, 从而产生不同的目标代码文件, 这对于程序的移植和调试是很有用的 条件编译有 种形式, 下面分别介绍 1. 一种形式 条件编译的一种形式如下 : #ifdef 标识符程序段 1 #else 程序段 2 #endif 它的功能是, 如果标识符已被 #define 语句定义过, 则会编译程序段 1; 否则编译程 序段 2 如果没有程序段 2( 它为空 ), 本格式中的 #else 可以没有 例如有以下程序 : #include <stdio.h> #define NUM OK /* 宏定义 */ void main() struct stu int num; char *name; float score; *ps; ps = (struct stu*)malloc(sizeof(struct stu)); ps->num = 102; ps->name="david"; ps->score=92.5; #ifdef NUM /* 条件编译, 若定义了 NUM, 则打印以下内容 */ printf("number = %d\nscore = %f\n", ps->num, ps->score); #else /* 若没有定义 NUM, 则打印以下内容 */ printf("name=%s\n",ps->name); #endif free(ps); 该程序的运行结果为 : Number = 102 Score = 在程序中根据 NUM 是否被定义来决定编译哪一个 printf 语句 因为在程序的二行 中定义了宏 NUM, 因此应编译一个 printf 语句, 运行结果则为输出学号和成绩 1 9

10 在此程序中, 宏 NUM 是符号串 OK 的别名, 其实也可以为任何符号串, 甚至不给 出任何符号串, 如下所示 : #define NUM 这样也具有同样的意义 读者可以试着将本程序中的宏定义去掉, 看一下程序的运 行结果, 这种形式的条件编译通常用在调试程序中 在调试时, 可以将要打印的信息用 #ifdef DEBUG 语句包含起来, 这样在调试完成之后, 就可以直接去掉宏定义 #define DEBUG, 这样就可以做成产品的发布版本了 条件编译语句和宏定义语句一样, 在 #ifdef 语句后不能加分号 (;) 2. 二种形式 条件编译的二种形式如下 : #ifndef 标识符程序段 1 #else 程序段 2 #endif 与一种形式的区别是将 ifdef 改为 ifndef 它的功能是, 如果标识符未被 #define 语 句定义过, 则编译程序段 1; 否则编译程序段 2 这与一种形式的功能正好相反. 三种形式 条件编译的三种形式如下 : #if 常量表达式程序段 1 #else 程序段 2 #endif 它的功能是, 如常量表达式的值为真 ( 非 0), 则编译程序段 1; 否则编译程序段 2 因此, 可以使程序在不同条件下完成不同的功能 : #include <stdio.h> #define IS_CURCLE 1 void main() float c = 2, r, s; #if IS_CURCLE r = * c * c; printf("area of round is: %f\n",r); #else s = c * c; printf("area of square is: %f\n",s); #endif 10

11 嵌入式 Linux C 语言高级用法 本例中采用了三种形式的条件编译 在程序一行宏定义中, 将 IS_CURCLE 定义为 1, 因此在条件编译时, 只编译计算和输出圆面积的代码部分 上面介绍的程序的功能可以使用条件语句来实现 但是使用条件语句将会对整个源程序进行编译, 生成的目标代码程序很长, 也比较麻烦 采用条件编译, 则根据编译条件选择性地进行编译, 生成的目标程序较短, 尤其是在调试和发布不同版本时非常有用 C 语言中的内存分配 本节将讲解 C 语言程序中的内存分配的原理和方法 内存的使用是程序设计中需要 考虑的重要因素之一, 这不仅由于系统内存是有限的 ( 尤其在嵌入式系统中 ), 而且内存 分配也会直接影响到程序的效率.2.1 C 语言程序所占内存分类 一个由 C 语言编写的程序占用的内存分为以下几个部分 栈 (stack): 由编译器自动分配释放, 存放函数的参数值 局部变量的值 返回 地址等, 其操作方式类似于数据结构中的栈 堆 (heap): 一般由程序员动态分配 ( 调用 mallo() 函数 ) 和释放 ( 调用 free() 函 数 ), 若程序员不释放, 程序结束时可能由操作系统回收 数据段 (data): 存放的是全局变量 静态变量 常数 根据存放的数据, 数据 段又可以分成普通数据段 ( 包括可读可写 / 只读数据段, 存放静态初始化的全局 变量或常量 ) BSS 数据段 ( 存放未初始化的全局变量 ) 代码段 (code): 用于存放程序代码 下面的这段程序说明了不同类型的内存分配 : /*C 语言中数据的内存分配 */ int a = 0; /* 可读可写数据段 */ char *p1; /*BSS 段 */ void main() int b; /*b 在栈 */ char s[] = "abc"; /*s 在栈, abc 在常量去 */ char *p2; /*p2 在栈 */ char *p = "12456"; /* 在常量区,p 在栈 */ static int c =0; /* 可读可写数据段 */ p1 = (char *)malloc(10); /* 分配得来的 10 字节的区域在堆区 */ p2 = (char *)malloc(20); /* 分配得来的 20 字节的区域在堆区 */ /* 从常量区的 Hello World 字符串复制到刚分配到的堆区 */ strcpy(p1, "Hello World"); 1 11

12 .2.2 堆和栈的区别 堆和栈有以下区别 1. 申请方式栈 (stack) 是由系统自动分配的 例如, 声明函数中一个局部变量 int b;, 那么系统自动在栈中为 b 开辟空间 堆 (head) 需要程序员自己申请, 并在申请时指定大小 使用 C 语言中的 malloc() 函数的例子如下所示 : p1 = (char *)malloc(10); 2. 申请后系统的响应堆在操作系统中有一个记录空闲内存地址的链表, 当系统收到程序的申请时, 系统就会开始遍历该链表, 寻找一个空间大于所申请空间的堆节点, 然后将该节点从空闲节点链表中删除, 并将该节点的空间分配给程序 另外, 对于大多数系统, 会在这块内存空间中的首地址处记录本次分配的大小, 这样, 代码中的删除语句才能正确地释放本内存空间 如果找到的堆节点的大小与申请的大小不相同, 系统会自动地将多余的那部分重新放入空闲链表中 只要栈的剩余空间大于所申请空间, 系统将为程序提供内存 否则将报异常, 提示栈溢出. 申请大小的限制堆是向高地址扩展的数据结构, 是不连续的内存区域 这是由于系统用链表来存储的空闲内存地址是不连续的 ( 这一点在后一节中会有详细说明 ), 而链表的遍历方向是由低地址向高地址 堆的大小受限于计算机系统中有效的虚拟内存, 因此堆获得的空间比较灵活, 也比较大 栈是向低地址扩展的数据结构, 是一块连续的内存区域 因此, 栈顶的地址和栈的最大容量是系统预先规定好的, 如果申请的空间超过栈的剩余空间, 将提示栈溢出 因此, 能从栈获得的空间较小 4. 申请速度的限制堆是由 malloc() 等语句分配的内存, 一般速度比较慢, 而且容易产生内存碎片, 不过用起来很方便 栈由系统自动分配, 速度较快, 但程序员一般无法控制 5. 堆和栈中的存储内容堆一般在堆的头部用一字节存放堆的大小, 堆中的具体内容由程序员安排 在调用函数时, 一个进栈的是函数调用语句的下一条可执行语句的地址, 然后是函数的各个参数 在大多数 C 编译器中, 参数是由右往左入栈的, 然后是函数中的局部 12

13 嵌入式 Linux C 语言高级用法 变量 当本次函数调用结束后, 局部变量先出栈, 然后是参数, 最后栈顶指针指向最开 始的存储地址, 也就是调用该函数处的下一条指令, 程序由该点继续运行 程序的可移植性考虑 嵌入式开发很重要的一个问题就是可移植性的问题 Linux 是一个可移植性非常好的系统, 这也是嵌入式 Linux 能够迅速发展起来的一个主要原因 因此, 嵌入式 Linux 在可移植性方面所做的工作是非常值得学习的 本节结合嵌入式 Linux 实例来讲解嵌入式开发在可移植性方面需要考虑的问题..1 字长和数据类型 能够由机器一次完成处理的数据称为字, 不同体系结构的字长通常会有所区别, 如现在通用的处理器字长为 2 位 为了解决不同的体系结构有不同的字长问题, 在嵌入式 Linux 中存在两种数据类型, 其一是不透明数据类型, 其二是长度明确的数据类型 不透明数据类型隐藏了它们的内部格式或结构 在 C 语言中, 它们就像黑盒一样, 开发者们利用 typedef 声明一个类型, 把它叫做不透明数据类型, 并希望其他开发者不要重新将其转化为对应的那个标准 C 类型 例如用来保存进程标识符的 pid_t 类型的实际长度被隐藏起来了, 尽管任何人都可以揭开它的面纱, 其实它就是一个 int 型数据 长度明确的数据类型也非常常见 作为一个程序员, 通常在程序中需要操作硬件设备, 这时就必须明确数据的长度 嵌入式 Linux 内核在 <asm/types.h> 中定义了这些长度明确的类型, 如表. 所示为这些类型的完整说明 表. 类型说明 类型描述 s8 u8 s16 u16 s2 u2 s64 u64 带符号字节无符号字节带符号 16 位整数无符号 16 位整数带符号 2 位整数无符号 2 位整数带符号 64 位整数无符号 64 位整数 1 1

14 这些长度明确的数据类型大部分是通过 typedef 对标准的 C 类型进行映射得到的, 在嵌入式 Linux 中的 </asm-arm/types.h> 就有如下定义 : typedef _signed_ char _s8; typedef unsigned char _u8; typedef _signed_ short _s16; typedef unsigned short _u16; typedef _signed_ int _s2; typedef unsigned int _u2; typedef _signed_ long long _s64; typedef unsigned long long _u64;..2 数据对齐 对齐是内存数据与内存中的相对位置相关的话题 如果一个变量的内存地址正好是 它长度的整数倍, 它就被称做是自然对齐的 例如, 对于一个 2 位 (4 个字节 ) 类型的 数据, 如果它在内存中的地址刚好可以被 4 整除 ( 最低两位是 0), 那它就是自然对齐的 一些体系结构对对齐的要求非常严格 通常基于 RISC 的系统载入未对齐的数据会 导致处理器陷入 ( 一种可处理的错误 ); 还有一些系统可以访问没有对齐的数据, 但性能 会下降 编写可移植性高的代码要避免对齐问题, 保证所有的类型都能够自然对齐.. 字节顺序 字节顺序是指一个字中各个字节的顺序, 有大端模式和小端模式 大端模式是指在 这种格式中, 字数据的高字节存储在低地址中, 而字数据的低字节则存放在高地址中 小端模式与大端存储格式相反, 在小端存储格式中, 低地址中存放的是字数据的低字节, 而高地址存放的是字数据的高字节 模式 ARM 体系结构支持大端模式 (big-endian) 和小端模式 (little-endian) 两种内存 请看下面的一段代码, 通过该段代码我们可以查看一个字 ( 通常为 4 字节 ) 数据的 每个字节在内存中的分布情况, 即可以分辨出当前系统采用哪种字节顺序模式 typedef unsigned char byte; typedef unsigned int word; word val2 = 0x ; byte val8 = *((byte*)&val2); 这段代码在小端模式和大端模式下的运行结果分别为 val8 = 0x21 和 val8 = 0x87 其 实, 变量 val8 所在的地方是 val2 的低地址, 因此如 val8 值为 val2 的低字节 (0x21), 则本系统是小端模式 ; 如 val8 值为 val2 的高字节 (0x87), 则本系统是大端模式, 如 图.1 所示 这种功能也可以用 union 联合体来实现, 建议读者动手编程尝试一下 14

15 嵌入式 Linux C 语言高级用法 图.1 小端和大端模式 C 和汇编的接口 C 语言是一种优秀的中级语言, 它既可以实现高级语言的模块化编程, 又可以实现 很多底层的操作 但是, 与汇编语言相比,C 语言的效率毕竟还是无法与之相媲美的 因此, 在对效率或硬件操作要求比较高的地方, 可以采用将部分汇编语句嵌入到 C 语言 中的方式来进行 GCC 的内嵌式汇编语言提供了一种在 C 语言源程序中直接嵌入汇编指令的办法, 既 能够直接控制所形成的指令序列, 又有着与 C 语言的良好接口, 所以在 Linux 内核代码 中有很多地方都使用了这一语句 在内嵌汇编中, 可以将 C 语言表达式指定为汇编指令的操作数, 而且不用去管如何 将 C 语言表达式的值读入哪个寄存器, 以及如何将计算结果写回 C 变量 用户只要告诉 程序中 C 语言表达式与汇编指令操作数之间的对应关系即可,GCC 会自动插入代码完成 必要的操作.4.1 内嵌汇编的语法 在阅读 C/C++ 原代码时经常会遇到内联汇编的情况, 下面简要介绍一下 ARM 体系 结构下的 asm 内嵌汇编用法 带有 C/C++ 表达式的内联汇编格式为 : asm ( 汇编语句模板 : 输出部分 : 输入部分 : 破坏描述部分 ) _asm_ 是 GCC 关键字 asm 的宏定义 :_asm_ 或 asm 用来声明一个内联汇编表达式, 所以任何一个内联汇编表达式都是以它开头的, 是必不可少的, 如下所示 : #define _asm_ asm #define _volatile_ volatile 有时在 _asm_ 后面使用 _volatile_ _volatile_ 或 volatile 是可选的 如果用了它, 则是 向 GCC 声明不允许对该内联汇编优化 ; 否则当使用了优化选项 (-O) 进行编译时,GCC 将根据自己的判断决定是否对这个内联汇编表达式中的指令进行优化 1 15

16 内联汇编共由 4 个部分组成 : 汇编语句模板 输出部分 输入部分和破坏描述部分, 各部分使用 : 隔开 如果使用了后面的部分, 而前面部分为空, 也需要用 : 隔开, 相应部分内容为空, 例如 : _asm_("": : :"memory") 下面就分别对关键部分进行一一介绍 1. 汇编语言模板汇编语句模板由汇编语句序列组成, 语句之间使用 ; \n 或 \n\t 分开 它可以是空的, 比如 _asm volatile_(""); 或 _asm_ (""); 都是完全合法的内联汇编表达式, 只不过这两条语句没有什么意义 但并非所有汇编语句模板为空的内联汇编表达式都是没有意义的, 比如 :_asm_ ("":::"memory"); 就非常有意义, 它向 GCC 声明 : 内存做了改动, GCC 在编译的时候会将此因素考虑进去 当在汇编语句模板中有多条指令的时候, 可以在一对引号中列出全部指令, 也可以将一条或几条指令放在一对引号中, 所有指令放在多对引号中 如果是前者, 可以将每一条指令放在一行 ; 如果要将多条指令放在一行, 则必须用分号 (;) 或换行符 (\n) 将它们分开 以上可以综合概括为 : 每条指令都必须被双引号括起来 两条指令必须用换行或分号分开 指令中的操作数可以使用占位符引用 C 语言变量, 操作数占位符最多 10 个, 如为 %0,%1,...,%9 例如, 在 ARM 系统结构上关闭中断的操作 : int disable_interrupts(void) unsigned long old,temp; _asm volatile_("mrs %0, cpsr\n" "orr %1, %0, #0x80\n" "msr cpsr_c, %1" : "=r" (old), "=r" (temp) : : "memory"); return (old & 0x80) == 0; 2. 输出部分输出部分用来指定当前内联汇编语句的输出 例如, 从 ARM 协处理器 p15 中读出 c1 值 : static unsigned long read_p15_c1 (void) unsigned long value; asm volatile_( 16

17 嵌入式 Linux C 语言高级用法 "mrcp15, 0, %0, c1, c0, read control reg\n" : "=r" 编译器选择一个 R* 寄存器 : : "memory"); #ifdef MMU_DEBUG printf ("p15/c1 is = %08lx\n", value); #endif return value; 输出部分描述输出操作数, 不同的操作数描述符之间用逗号隔开, 每个操作数描述 符由限定字符串和 C 语言变量组成 每个输出操作数的限定字符串必须包含 =, 表示 它是一个输出操作数 限定字符串表示对该变量的限制条件, 这样 GCC 就可以根据这些 条件决定如何分配寄存器, 如何产生必要的代码处理指令操作数与 C 表达式或 C 变量之 间的联系. 输入部分 输入部分用来指定当前内联汇编语句的输入, 每个操作数描述符由限定字符串和 C 语言表达式或者 C 语言变量组成, 格式为形如 "constraint" (variable) 的列表 ( 不同的操作 数描述符之间使用逗号隔开 ) 例如, 向 ARM 协处理器 p15 中写入 C1 值 : static void write_p15_c1 (unsigned long value) #ifdef MMU_DEBUG printf ("write %08lx to p15/c1\n", value); #endif _asm volatile_( "mcrp15, 0, %0, c1, c0, write it back\n" : : "r" 编译器选择一个 R* 寄存器 : "memory"); 4. 破坏描述部分 有时候, 我们想通知 GCC 当前内联汇编语句可能会对某些寄存器或内存进行修改, 希望 GCC 在编译时能够将这一点考虑进去, 那么就可以在破坏描述部分声明这些寄存器 或内存 这种情况一般发生在 : 一个寄存器出现在汇编语句模板中, 但不是由输入 / 输出 部分操作表达式所指定的, 也不是在一些输入 / 输出操作表达式使用 r 约束时由 GCC 为其选择的 ; 同时此寄存器被汇编语句模板中的指令修改, 而这个寄存器只是供当前内 联汇编临时使用的情况 例如 : _asm_ ("mov R0, #0x4" : : : "R0"); 1 17

18 寄存器 R0 出现在汇编语句模板, 并且被 mov 指令修改, 但未被任何输入 / 输出部分 操作表达式指定, 所以需要在破坏描述部分指定 R0, 以让 GCC 知道这一点 因为在输入 / 输出部分操作表达式所指定的寄存器, 或为一些输入 / 输出部分操作表 达式使用 r 约束, 让 GCC 为自己选择一个寄存器时,GCC 对这些寄存器是非常清 楚的 它知道这些寄存器是被修改的, 我们根本不需要在破坏描述部分再声明它们 但除此之外,GCC 对剩下的寄存器中哪些会被当前的内联汇编修改一无所知 所以如果 真的在当前内联汇编指令中修改了它们, 那么最好在破坏描述部分中声明它们, 让 GCC 针对这些寄存器做相应的处理 ; 否则有可能会造成寄存器的不一致, 从而造成程序执行 错误 如果一个内联汇编语句的破坏描述部分存在 memory, 那么 GCC 会保护内存数据 如果在此内联汇编之前某个内存的内容被装入了寄存器, 那么在这个内联汇编之后, 当 需要使用这个内存中的内容时, 就会直接到这个内存中重新读取, 而不是使用被存放在 寄存器中的备份, 因为这个时候寄存器中的备份已经很可能和内存中的内容不一致了 这只是使用 memory 时 GCC 会保证做到的一点, 但这并不是全部 因为使用 memory 是向 GCC 声明内存发生了变化, 而内存发生变化带来的影响并不止这一点 例如 : int main(int _argc, char* _argv[]) int* _p = (int*)_argc; (*_p) = 9999; _asm_("":::"memory"); if((*_p) == 9999) return 5; return (*_p); 本例中, 如果没有那条内联汇编语句, 则 if 语句的判断条件就完全是多余的 GCC 在优化时会意识到这一点, 直接只生成 return 5 的汇编代码, 而不会再生成 if 语句的相 关代码, 也不会生成 return (*_p) 的相关代码 但如果加上了这条内联汇编语句, 它除了 声明内存变化之外, 什么都没有做 但因为内存变量可能发生变化,GCC 就不能简单地 认为它不需要判断就知道 (*_p) 一定与 9999 相等, 它只有老老实实生成这条 if 语句的汇 编代码, 一起相关的两个 return 语句相关代码 另外, 在 Linux 内核中内存屏障也是基于它实现的 在 <include/asm/system.h> 中 : # define barrier() _asm_volatile_("": : :"memory") memory 可能是内嵌汇编中比较难懂的部分 为解释清楚它, 先介绍一下编译器 的优化知识, 再看 C 关键字 volatile 18

19 嵌入式 Linux C 语言高级用法.4.2 编译器优化介绍 由于内存访问速度远不及 CPU 处理速度, 为提高机器整体性能, 在硬件上引入硬件高速缓存 Cache, 加速对内存的访问 另外, 在现代 CPU 中指令的执行并不一定严格按照顺序执行, 没有相关性的指令可以乱序执行, 以充分利用 CPU 的指令流水线, 提高执行速度 以上是硬件级别的优化 软件级别的优化有两种 : 一种是在编写代码时由程序员优化, 另一种是由编译器进行优化 编译器优化常用的方法有 : 将内存变量缓存到寄存器和调整指令顺序充分利用 CPU 指令流水线等, 常见的是重新排序读写指令 对常规内存进行优化的时候, 这些优化是透明的, 而且效率很好 由编译器优化或者硬件重新排序引起的问题的解决办法是在以特定顺序执行的操作之间设置内存屏障 (memory barrier), Linux 提供了一个宏用于解决编译器的执行顺序问题 : void barrier(void) 主要是保证程序的执行遵循顺序一致性 有时候写代码的顺序不一定是最终执行的顺序, 这是和处理器有关的 这个函数通知编译器插入一个内存屏障, 但对硬件无效, 编译后的代码会把当前 CPU 寄存器中的所有修改过的数值存入内存, 需要这些数据的时候再重新从内存中读出.4. C 语言关键字 volatile C 语言关键字 volatile( 注意它是用来修饰变量而不是上面介绍的 volatile ) 表明某个变量的值可能随时被外部改变 ( 如外设端口寄存器值 ), 因此对这些变量的存取不能缓存到寄存器, 每次使用时需要重新读取 该关键字在多线程环境下经常使用, 因为在编写多线程的程序时, 同一个变量可能被多个线程修改, 而程序通过该变量同步各个线程 对于 C 编译器来说, 它并不知道这个值会被其他线程修改, 自然就把它缓存到寄存器里面 volatile 的本意是指这个值可能会在当前线程外部被改变, 此时编译器知道该变量的值会在外部改变, 因此每次访问该变量时会重新读取 这个关键字在外设接口编程中经常会使用.4.4 memory 描述符 有了上面的知识就不难理解 memory 修改描述符了,memory 描述符告知 GCC 以下内容 不要将该段内嵌汇编指令与前面的指令重新排序, 也就是说在执行内嵌汇编代码之前, 它前面的指令都执行完毕 不要将变量缓存到寄存器, 因为这段代码可能会用到内存变量, 而这些内存变 1 19

20 量会以不可预知的方式发生改变, 因此 GCC 插入必要的代码前先将缓存到寄存器的变量值写回内存, 如果后面又访问这些变量, 则需要重新访问内存 如果汇编指令修改了内存, 但是 GCC 本身却察觉不到, 因为在输出部分没有描述, 此时就需要在修改描述部分增加 memory, 告诉 GCC 内存已经被修改,GCC 得知这个信息后, 就会在这段指令之前插入必要的指令将前面因为优化 Cache 而缓存到寄存器中的变量值先写回内存, 如果以后又要使用这些变量, 则再重新读取 当然, 使用 volatile 也可以达到这个目的 本小结 本主要介绍了嵌入式 Linux C 语言的高级用法, 包括一些重要的话题, 如预处理 内存分配 程序的移植性考虑及 C 语言与汇编语言之间的混合编程等 这些在使用嵌入式 Linux C 开发的应用程序中都是常见的 在本中重点讲述了一些在嵌入式 Linux C 语言中常见的基本问题和高级问题, 希望读者熟练掌握每个小节的基本知识点 本习题 1. 宏定义和函数之间有哪些区别, 宏定义 inline 函数有区别吗? 2. 请具体分析 hello.c 程序的预处理之后的代码. 简述 C 语言的各种数据如何在内存中分配, 它们分别对程序的运行效率有哪些影响 4. 与程序的移植性相关的问题有哪些? 怎么能写出平台无关或者移植性很强的程序? 20

21 嵌入式 Linux C 语言高级用法 5. 在 ARM 目标板的某个 GPIO 端口上连续进行写操作 ( 交替进行写 0 和写 1 的操作 ), 以便观察 I/O 端口的工作频率 分别用纯 C 语言和内嵌汇编的 C 语言编写该功能代码, 并比较两种方法的运行效率 资源分享 : 1 华清远见精品图书专区 : 2 华清远见嵌入式 Linux 视频下载基地 : 华清远见近期免费活动公告 : 4 华清远见学员大本营 : 联系我们 : 免费电话 : , 华清远见集团官网 : 华清远见企业学院 : 华清远见嵌入式学院 : 华清远见 G 学院 : 1 21

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年 移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 预处理 2 预处理器 C 语言的编译系统分为编译预处理和正式编译 预处理作用 : 对源程序编译之前做一些处理, 生成扩展 C 源程序 预处理器的行为是由预处理指令控制的 宏定义 文件包含 条件编译 #define #ifdef

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

ARM中C和汇编混合编程及示例.doc

ARM中C和汇编混合编程及示例.doc ARM 中 C 和汇编混合编程及示例 在嵌入式系统开发中, 目前使用的主要编程语言是 C 和汇编,C++ 已经有相应的编译器, 但是现在使用还是比较少的 在稍大规模的嵌入式软件中, 例如含有 OS, 大部分的代码都是用 C 编写的, 主要是因为 C 语言的结构比较好, 便于人的理解, 而且有大量的支持库 尽管如此, 很多地方还是要用到汇编语言, 例如开机时硬件系统的初始化, 包括 CPU 状态的设定,

More information

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout

More information

Static Enforcement of Security with Types

Static Enforcement of Security with Types 例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40; static long aa = 10; func(

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

C

C C 2017 3 14 1. 2. 3. 4. 2/95 C 1. 3/95 C I 1 // talkback.c: 2 #include 3 #include 4 #define DENSITY 62.4 5 int main(void) 6 { 7 float weight, volume; 8 int size; 9 unsigned long letters;

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

网C试题(08上).doc

网C试题(08上).doc 学习中心 姓名 学号 西安电子科技大学网络与继续教育学院 高级语言程序设计 (C) 全真试题 ( 闭卷 90 分钟 ) 题号一二三总分 题分 60 20 20 得分 一 单项选择题 ( 每小题 3 分, 共 60 分 ) 1.C 语言程序的基本单位是 A) 程序行 B) 语句 C) 函数 D) 字符 2. 下列四组选项中, 均是不合法的用户标识符的选项是 A)A B)getc C)include D)while

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378>

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378> 第 1 部分 Visual Studio 6.0 开发环境介绍 本书以 Visual C++ 6.0 作为 C 源程序的实践开发环境, 本章将首先介绍 Visual C++ 6.0 环境的基本操作, 包括 Visual C++ 6.0 的安装和启动,C 源程序的编辑 运行与调试 1.1 安装与启动 Visual C++ 6.0 MSDN Visual C++ 6.0 1.1 Microsoft Visual

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023) ( CIP) /. :, 2005. 2 ( ) ISBN 7-5624-3339-9.......... TP311. 1 CIP ( 2005) 011794 : : : : * : : 174 ( A ) :400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / /www. cqup. com. cn : fxk@cqup.

More information

epub 33-8

epub 33-8 8 1) 2) 3) A S C I I 4 C I / O I / 8.1 8.1.1 1. ANSI C F I L E s t d i o. h typedef struct i n t _ f d ; i n t _ c l e f t ; i n t _ m o d e ; c h a r *_ n e x t ; char *_buff; /* /* /* /* /* 1 5 4 C FILE

More information

第3章.doc

第3章.doc 3 3 3 3.1 3 IT Trend C++ Java SAP Advantech ERPCRM C++ C++ Synopsys C++ NEC C C++PHP C++Java C++Java VIA C++ 3COM C++ SPSS C++ Sybase C++LinuxUNIX Motorola C++ IBM C++Java Oracle Java HP C++ C++ Yahoo

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

Microsoft Word - AT&T2_bold.doc

Microsoft Word - AT&T2_bold.doc AT&T 汇编语言与 GCC 内嵌汇编简介 版本 0.1 时间 04/3/30 EMAIL chforest_chang@hotmail.com 1 AT&T 与 INTEL 的汇编语言语法的区别...3 1.1 大小写...3 1.2 操作数赋值方向...3 1.3 前缀...3 1.4 间接寻址语法...4 1.5 后缀...4 1.6 指令...5 2 GCC 内嵌汇编...5 2.1 简介...5

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

大侠素材铺

大侠素材铺 编译原理与技术 词法分析 Ⅱ 计算机科学与技术学院李诚 13/09/2018 主要内容 记号 (token) 源程序 词法分析器 getnexttoken 语法分析器 符号表 词法分析器的自动生成 正则表达式 NFA DFA 化简的 DFA 词法分析器的生成器 Lex: flex jflex Fst lexicl nlyzer genertor 2/51 Regulr Expr to NFA 正则表达式

More information

第 10 章对文件的输入输出 10.1 C 文件的有关基本知识 什么是文件文件有不同的类型, 在程序设计中, 主要用到两种文件 : (1) 程序文件 包括源程序文件 ( 后缀为.c) 目标文件( 后缀为.obj) 可执行文件( 后缀为.exe) 等 这种文件的内容是程序代码 (2) 数

第 10 章对文件的输入输出 10.1 C 文件的有关基本知识 什么是文件文件有不同的类型, 在程序设计中, 主要用到两种文件 : (1) 程序文件 包括源程序文件 ( 后缀为.c) 目标文件( 后缀为.obj) 可执行文件( 后缀为.exe) 等 这种文件的内容是程序代码 (2) 数 第 10 章对文件的输入输出 10.1 C 文件的有关基本知识 10.1.1 什么是文件文件有不同的类型, 在程序设计中, 主要用到两种文件 : (1) 程序文件 包括源程序文件 ( 后缀为.c) 目标文件( 后缀为.obj) 可执行文件( 后缀为.exe) 等 这种文件的内容是程序代码 (2) 数据文件 文件的内容不是程序, 而是供程序运行时读写的数据, 如在程序运行过程中输出到磁盘 ( 或其他外部设备

More information

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco

Windows RTEMS 1 Danilliu MMI TCP/IP QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos eco Windows RTEMS 1 Danilliu MMI TCP/IP 80486 QEMU i386 QEMU ARM POWERPC i386 IPC PC104 uc/os-ii uc/os MMI TCP/IP i386 PORT Linux ecos Linux ecos ecos ecos Email www.rtems.com RTEMS ecos RTEMS RTEMS Windows

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

untitled

untitled 1 DBF (READDBF.C)... 1 2 (filetest.c)...2 3 (mousetes.c)...3 4 (painttes.c)...5 5 (dirtest.c)...9 6 (list.c)...9 1 dbf (readdbf.c) /* dbf */ #include int rf,k,reclen,addr,*p1; long brec,erec,i,j,recnum,*p2;

More information

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63> 1 实验目的 实验 2 C 和汇编语言的混合编程实验 学习在 C 程序中使用嵌入式汇编编写程序 了解嵌入式汇编的格式 语言特点 2 实验设备 S3C2410 开发板 ADS1.2 集成开发环境,JTAG 调试器 串口连接线 3 实验原理 在 ARM 的应用开发中,C 语言功能强大且容易编写程序, 但是汇编程序在底层的操作仍然具有 C 程序无法替代的功能, 有时候我们需要在 C 程序中嵌入汇编程序来完成一些直接对底层的诸如寄存器的操作

More information

格式化字符串 Weifeng Sun School of Software, DLUT

格式化字符串 Weifeng Sun School of Software, DLUT 格式化字符串 Weifeng Sun School of Software, DLUT 格式化字符串漏洞 格式化字符串, 也是一种比较常见的漏洞类型 会触发该漏洞的函数很有限 主要就是 printf 还有 sprintf,fprintf 等等 c 库中 print 家族的函数 >int printf(const char* format,...) 2 / 42 3 / 42 A B 字符串指针 char

More information

Microsoft PowerPoint - 01_Introduction.ppt

Microsoft PowerPoint - 01_Introduction.ppt Hello, World C 程序设计语言 第 1 章章观其大略 孙志岗 sun@hit.edu.cn http://sunner.cn prf("hello,, world\n"); 超级无敌考考你 : 如何把 hello 和 world 分别打印在两行? 2004-12-19 A Tutorial Introduction 2 hello.c 打印华氏温度与摄氏温度对照表 计算公式 : C=(5/9)(

More information

C/C++ - 字符串与字符串函数

C/C++ - 字符串与字符串函数 C/C++ Table of contents 1. 2. 3. 4. 1 char C 2 char greeting [50] = " How " " are " " you?"; char greeting [50] = " How are you?"; 3 printf ("\" Ready, go!\" exclaimed John."); " Ready, go!" exclaimed

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

C

C C 2017 4 1 1. 2. while 3. 4. 5. for 6. 2/161 C 7. 8. (do while) 9. 10. (nested loop) 11. 12. 3/161 C 1. I 1 // summing.c: 2 #include 3 int main(void) 4 { 5 long num; 6 long sum = 0L; 7 int status;

More information

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期  开放本科  期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l 试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 c++ 程序中都必须包含有这样一个函数, 该函数的函数名为 ( ) A. main

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期  开放本科  期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new 试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 C 十 + 程序中都必须包含有这样一个函数, 该函数的函数名为 ) A.main

More information

程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de

程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de 程序 14-24 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #define _LINUX_MATH_EMU_H 8 9 #include

More information

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期  开放本科  期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默 试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默认扩展名为 ( ) A. cpp B. c C. exe D. obj 2. 设 x 和 y 均为逻辑值,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 1 章程序设计和 C 语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C 语言的发展及其特点 1.4 最简单的 C 语言程序 1.5 运行 C 程序的步骤与方法 1.6 程序设计的任务 1.1 什么是计算机程序 程序 : 一组计算机能识别和执行的指令 只要让计算机执行这个程序, 计算机就会自动地 有条不紊地进行工作 计算机的一切操作都是由程序控制的, 离开程序, 计算机将一事无成

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf (%d, & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf (%d %d 2013 18 ( ) 1. C pa.c, pb.c, 2. C++ pa.cpp, pb.cpp, Compilation Error cin scanf Time Limit Exceeded 1: A 5 B 5 C 5 D 5 E 5 F 5 1 2013 C 1 # include 2 int main ( void ) 3 { 4 int cases, a, b,

More information

Andes Technology PPT Temp

Andes Technology PPT Temp 晶心科技線上技術研討會 AndesCore 便捷的全 C 嵌入式编程 晶心科技市場及技術服務部毛礼杰軟件經理 WWW.ANDESTECH.COM 大纲 系统初始化介绍 异常和中断说明 全 C 语法例子说明 总结 2 CPU 相关特性 1: 中断向量表 系统初始化 (1) 2: 系统寄存器 通常需要用 assembly( 汇编 / 组合 ) 语言来操作 AndesCore 全 C 嵌入式编程 C 扩展语法

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

Microsoft PowerPoint - 10 模板 Template.pptx

Microsoft PowerPoint - 10 模板 Template.pptx 模板 Tempalte 泛型编程的需要 Why Templates? 设想你对整数类型实现了一个排序算法 : void sort(int *is,int n); 用该函数可以对实 复数或工资单排序吗? 模板可以复用源代码 - 泛型编程. inline void Swap( int &x, int &y){ int t = x; x = y; y =t; inline void Swap(double

More information

C/C++ - 数组与指针

C/C++ - 数组与指针 C/C++ Table of contents 1. 2. 3. 4. 5. 6. 7. 8. 1 float candy [ 365]; char code [12]; int states [50]; 2 int array [6] = {1, 2, 4, 6, 8, 10}; 3 // day_mon1.c: # include # define MONTHS 12 int

More information

C

C C 14 2017 5 31 1. 2. 3. 4. 5. 2/101 C 1. ( ) 4/101 C C ASCII ASCII ASCII 5/101 C 10000 00100111 00010000 ASCII 10000 31H 30H 30H 30H 30H 1 0 0 0 0 0 ASCII 6/101 C 7/101 C ( ) ( ) 8/101 C UNIX ANSI C 9/101

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

Microsoft PowerPoint - ds-1.ppt [兼容模式]

Microsoft PowerPoint - ds-1.ppt [兼容模式] http://jwc..edu.cn/jxgl/ HomePage/Default.asp 2 说 明 总 学 时 : 72( 学 时 )= 56( 课 时 )+ 16( 实 验 ) 行 课 时 间 : 第 1 ~14 周 周 学 时 : 平 均 每 周 4 学 时 上 机 安 排 待 定 考 试 时 间 : 课 程 束 第 8 11 12 章 的 内 容 为 自 学 内 容 ; 目 录 中 标 有

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 在第 2 章中已经对 C 语言变量的声明 定义及初始化进行了介绍, 并简单介绍了 C 语言变量的作用域, 本章将对变量的存储方式进行详细的介绍, 不同存储方式的变量有不同的生命期, 作用域也各不相同 通过对 C 语言变量存储方式的介绍, 使更加深入的了解 C 语言变量的作用域的工作原理 本章讲述的知识点包括 : C 语言变量的生存期和作用域 ; C 语言局部变量与全局变量 ; C 语言变量的存储方式

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

More information

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ 考生注意 : 本试卷共七大题, 满分 150 分 考试时间为 3 小时 ; 所有答案均写在答题纸上 ( 注明题号 ), 在此答题一律无效无效 一 选择题 ( 本题共 20 小题, 每小题 2 分, 满分 40 分 ) 1 char ch 1 2 A 0

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

Microsoft Word - 新1-12.doc

Microsoft Word - 新1-12.doc 实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性

More information

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 PERSON 1 Person 题目描述 编写程序, 定义一个基类 Person, 包含 name 和 age 两个数据成员 ; 再由它派生出学生类 Student 和教师类 Teacher, 其中学生类添加学号 no 数据, 教师类添加职称 title 数据 ; 要求每个类均有构造函数 析构函数和显示数据的函数

More information

C/C++语言 - 运算符、表达式和语句

C/C++语言 - 运算符、表达式和语句 C/C++ Table of contents 1. 2. 3. 4. C C++ 5. 6. 7. 1 i // shoe1.c: # include # define ADJUST 7. 64 # define SCALE 0. 325 int main ( void ) { double shoe, foot ; shoe = 9. 0; foot = SCALE * shoe

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

C/C++语言 - 分支结构

C/C++语言 - 分支结构 C/C++ Table of contents 1. if 2. if else 3. 4. 5. 6. continue break 7. switch 1 if if i // colddays.c: # include int main ( void ) { const int FREEZING = 0; float temperature ; int cold_ days

More information

untitled

untitled 1 5 IBM Intel 1. IBM 第 1/175 页 第 2/175 页 第 3/175 页 80 第 4/175 页 2. IBM 第 5/175 页 3. (1) 第 6/175 页 第 7/175 页 第 8/175 页 = = 第 9/175 页 = = = = = 第 10/175 页 = = = = = = = = 3. (2) 第 11/175 页 第 12/175 页 第 13/175

More information

Microsoft Word - MAN2023A_CH_APPONE.doc

Microsoft Word - MAN2023A_CH_APPONE.doc AT91 softpack 1.5 代码解读 基于 SAM7X EK 综合应用代码解读 文档编号 文档版本 Rev. A 文档摘要 基于 AT91SAM7X EK 开发板的代码解读,GPIO H161T01 代码解读 关键词 AT91SAM7X256 系统板 创建日期 2010 07 14 创建人员 Cust126 审核人员 Robin 文档类型 公开发布 / 开发板配套文件 版权信息 Mcuzone

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 lambda 表达式及其应用 lambda 表达式是 Java 8 提供的一种新特性, 它使得 Java 也能像 C# 和 C++ 语言一样进行简单的 函数式编程, 这不仅简化了某些通用结构的实现方式, 也大大增强了 Java 语言的表达功能 3.1 lambda 表达式简介 lambda 表达式是基于数学中的 λ 演算得名, 本质上就是一个没有方法名的匿名方法 例如, 有一个方法定义如下

More information

C语言的应用.PDF

C语言的应用.PDF AVR C 9 1 AVR C IAR C, *.HEX, C,,! C, > 9.1 AVR C MCU,, AVR?! IAR AVR / IAR 32 ALU 1KBytes - 8MBytes (SPM ) 16 MBytes C C *var1, *var2; *var1++ = *--var2; AVR C 9 2 LD R16,-X ST Z+,R16 Auto (local

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 1 2 1 2 3 4 5 6 7 8 9 10 3 1 150 2 150 1 1 1.1 1.1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.3.1 1.3.2 1.4 1.4.1 CPU 1.4.2 I/O 1.4.3 I/O 1.5 1.5.1 CISC RISC 1.5.2 1.5.3 1.6 1.6.1 1.6.2 N 1.6.3 2 2.1 2.1.1 2.1.2 2.1.3

More information

CHAPTER VC#

CHAPTER VC# 1. 2. 3. 4. CHAPTER 2-1 2-2 2-3 2-4 VC# 2-5 2-6 2-7 2-8 Visual C# 2008 2-1 Visual C# 0~100 (-32768~+32767) 2 4 VC# (Overflow) 2-1 2-2 2-1 2-1.1 2-1 1 10 10!(1 10) 2-3 Visual C# 2008 10! 32767 short( )

More information

untitled

untitled 1 7 7.1 7.2 7.3 7.4 7.5 2 7.1 VFT virtual 7.1 3 1 1. 2. public protected public 3. VFT 4. this const volatile 4 2 5. ( ) ( ) 7.1 6. no-static virtual 7.2 7. inline 7.3 5 3 8. this this 9. ( ) ( ) delete

More information

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un Linux C July 27, 2016 Contents 1 Linux IDE 1 2 GCC 3 2.1 hello.c hello.exe........................... 5 2.2............................... 9 2.2.1 -Wall................................ 9 2.2.2 -E..................................

More information

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1

C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1 C++ 程序设计 OJ9 - 参考答案 MASTER 2019 年 6 月 7 日 1 1 CARDGAME 1 CardGame 题目描述 桌上有一叠牌, 从第一张牌 ( 即位于顶面的牌 ) 开始从上往下依次编号为 1~n 当至少还剩两张牌时进行以下操作 : 把第一张牌扔掉, 然后把新的第一张放到整叠牌的最后 请模拟这个过程, 依次输出每次扔掉的牌以及最后剩下的牌的编号 输入 输入正整数 n(n

More information

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab 第 1 章 C 语言基础与顺序结构 学习目标 1. 掌握 C 语言程序的结构 2. 合理选用数据类型 3. 掌握算术运算符和赋值运算符 4. 掌握控制数据的输入 输出方法 5. 掌握顺序结构以及顺序结构的流程 6. 掌握 Visual C++ 6.0 集成环境的使用方法 7. 掌握转换大小写字母的方法 8. 掌握产生随机整数的方法 计算机由硬件系统和软件系统组成, 其中硬件是物质基础, 而软件是计算机的灵魂

More information