return 0;
前提:C 语言规定,main()
是程序的入口函数,即所有的程序一定要包含一个main()
函数。程序总是从这个函数开始执行,如果没有该函数,程序就无法启动。其他函数都是通过它引入程序的。
main()
的写法,要给出返回值的类型和参数的类型,就像下面这样。
int main(void) {
printf("Hello World\n");
return 0;
}
上面示例中,最后的return 0;
表示函数结束运行,返回0
。C 语言约定,返回值0
表示函数运行成功,如果返回其他非零整数,就表示运行失败,代码出了问题。系统根据main()
的返回值,作为整个程序的返回值,确定程序是否运行成功。
正常情况下,如果main()
里面省略return 0
这一行,编译器会自动加上,即main()
的默认返回值为0。所以,写成下面这样,效果完全一样。
int main(void) {
printf("Hello World\n");
}
由于 C 语言只会对main()
函数默认添加返回值,对其他函数不会这样做,所以建议总是保留return
语句,以便形成统一的代码风格。
return 其它
return
语句。return
语句给出函数的返回值,程序运行到这一行,就会跳出函数体,结束函数的调用。如果函数没有返回值,可以省略return
语句,或者写成return;
。
static int gc2053_read_register(int addr)
{
int addr_ing;
int status;
int rx_data;
write_mem(CURRENT_I2C_BASE + IC_DATA_CMD, addr);
write_mem(CURRENT_I2C_BASE + IC_DATA_CMD, 0x700);
status = read_mem(CURRENT_I2C_BASE + IC_RAW_INTR_STAT);
while ((status & 0x4) != 0x4)
{
status = read_mem(CURRENT_I2C_BASE + IC_RAW_INTR_STAT);
}
rx_data = read_mem(CURRENT_I2C_BASE + IC_DATA_CMD);
return rx_data;//函数返回一个整数
}
......
........
value0 = gc2053_read_register(0xb3); //引用函数,获得返回值
&
与运算符
与运算符 &
将两个值的每一个二进制位进行比较,返回一个新的值。当两个二进制位都为1
,就返回1
,否则返回0
。
10010011 & 00111101 // 返回 00010001
上面示例中,两个八位二进制数进行逐位比较,返回一个新的值。
与运算符&
可以与赋值运算符=
结合,简写成&=
。
int val = 3;
val = val & 0377;
// 简写成
val &= 0377;
例子:
(1)while ((status & 0x4) != 0x4) {........ }
(2)value1 = (value0 << 8) & 0x3F00;
| 或运算符
或运算符|
将两个值的每一个二进制位进行比较,返回一个新的值。两个二进制位只要有一个为1
(包含两个都为1
的情况),就返回1
,否则返回0
。
// 返回 10111111
10010011 | 00111101
运算符的优先级
运算符的优先级顺序很复杂。下面是部分运算符的优先级顺序(按照优先级从高到低排列)。
- 圆括号(
()
) - 自增运算符(
++
),自减运算符(--
) - 一元运算符(
+
和-
) - 乘法(
*
),除法(/
) - 加法(
+
),减法(-
) - 关系运算符(
<
、>、>=、<=、==相等、!= 不相等
等) - 赋值运算符(
=
)
例子:while ((status & 0x4) != 0x4){.......} // 多用括号,划分明确的优先级
printf()打印
函数
printf()
的作用是将参数文本输出到屏幕,(比如各种log)。它名字里面的f
代表format
(格式化),表示可以定制输出文本的格式。
printf()
是在标准库的头文件stdio.h
定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。
#include <stdio.h>
int main(void) {
printf("Hello World\n");
}
上面命令会在屏幕上输出一行文字“Hello World”。
printf()
运行结束后,不会自动换行。为了让光标移到下一行的开头,可以在输出文本的结尾,添加一个换行符\n
。如果文本内部有换行,也可以通过插入换行符来实现。
printf("Hello\nWorld\n");
占位符----常用于输出变量
例子:
ts_printf("pSensorAGain->gain[ISI_LINEAR_PARAS]%f,sensor_gain=%d gainLevelTable[i]=0x%d,tol_dig_gain= %d i = %d\n",pSensorAGain->gain[ISI_LINEAR_PARAS],sensor_gain,gainLevelTable[i],tol_dig_gain,i);
用占位符%d 代替sensor_gain, 当计算输入变化时,可以动态输出不同的结果。
printf()
可以在输出文本中指定占位符。所谓“占位符”,就是这个位置可以用其他值代入。
// 输出 There are 3 apples
printf("There are %i apples\n", 3);
上面示例中,"There are %i apples\n "
里面的%i
就是占位符,表示这个位置要用其他值来替换。占位符的第一个字符一律为百分号%
,第二个字符表示占位符的类型,%i
表示这里代入的值必须是一个整数。printf()
的第二个参数 3 就是替换占位符的值,上面的例子是整数3
替换%i
。执行后的输出结果就是There are 3 apples
。
输出文本里面可以使用多个占位符。
printf("%s says it is %i o'clock\n", "Ben", 21);
上面示例中,输出文本%s says it is %i o'clock
有两个占位符,第一个是字符串占位符%s
,第二个是整数占位符%i
,分别对应printf()
的第二个参数(Ben
)和第三个参数(21
)。执行后的输出就是Ben says it is 21 o'clock
。
printf()
参数与占位符是一一对应关系,如果有n
个占位符,printf()
的参数就应该有n + 1
个。如果参数个数少于对应的占位符,printf()
可能会输出内存中的任意值。
printf()
的占位符有许多种类,与 C 语言的数据类型相对应。下面列出常用的占位符,方便查找,具体含义在后面章节介绍。
%a
:十六进制浮点数,字母输出为小写。%A
:十六进制浮点数,字母输出为大写。%c
:字符。%e
:使用科学计数法的浮点数,指数部分的e
为小写。%E
:使用科学计数法的浮点数,指数部分的E
为大写。%i
:整数,基本等同于%d
。%d
:十进制整数。%f
:小数(包含float
类型和double
类型)。%x
:十六进制整数。%s
:字符串。%g
:6个有效数字的浮点数。整数部分一旦超过6位,就会自动转为科学计数法,指数部分的e
为小写。%G
:等同于%g
,唯一的区别是指数部分的E
为大写。%hd
:十进制 short int 类型。%ho
:八进制 short int 类型。%hx
:十六进制 short int 类型。%hu
:unsigned short int 类型。%ld
:十进制 long int 类型。%lo
:八进制 long int 类型。%lx
:十六进制 long int 类型。%lu
:unsigned long int 类型。%lld
:十进制 long long int 类型。%llo
:八进制 long long int 类型。%llx
:十六进制 long long int 类型。%llu
:unsigned long long int 类型。%Le
:科学计数法表示的 long double 类型浮点数。%Lf
:long double 类型浮点数。%n
:已输出的字符串数量。该占位符本身不输出,只将值存储在指定变量之中。%o
:八进制整数。%p
:指针。%u
:无符号整数(unsigned int)。%zd
:size_t
类型。%%
:输出一个百分号。
C 语言的编译
C 语言是一种编译型语言,源码都是文本文件,本身无法执行。必须通过编译器,生成二进制的可执行文件,才能执行。编译器将代码从文本翻译成二进制指令的过程,就称为编译阶段,又称为“编译时”(compile time),跟运行阶段(又称为“运行时”)相区分。
目前,最常见的 C 语言编译器是自由软件基金会推出的 GCC 编译器,它可以免费使用。Linux 和 Mac 系统可以直接安装 GCC,Windows 系统可以安装 MinGW。
网上有在线编译器,能够直接在网页上模拟运行 C 代码,查看结果,下面就是两个这样的工具。
- CodingGround: Online C Compiler
- OnlineGDB: Online C Compiler - online editor
gcc
C 语言的源代码文件,通常以后缀名.c
结尾。比如hello.c 的内容为:
#include <stdio.h>
int main(void) {
printf("Hello World\n");
return 0;
}
假设安装好了 GCC 编译器,执行下面的命令。就可以将源文件hello.c
编译成二进制代码。
$ gcc hello.c
运行gcc 默认会在当前目录下生成一个编译产物文件a.out
(assembler output 的缩写,Windows 平台为a.exe
)。然后执行该文件,就会在屏幕上输出Hello World
。
$ ./a.out
Hello World
GCC 可以指定编译产物的文件名,使用-o
参数(output 的缩写)
$ gcc -o hello hello.c
上面命令的-o hello
指定编译产物的文件名为hello
(取代默认的a.out
)。