主要回顾 C 语言常用语法与函数。
# 概念
c 存储类
- auto:auto 存储类是所有局部变量默认的存储类。auto 是局部变量的默认存储类,限定变量只能在函数内部使用;
- register:register 代表了寄存器变量,不在内存中使用;
- static:static 是全局变量的默认存储类,表示变量在程序生命周期内可见;
- extern:extern 表示全局变量,即对程序内所有文件可见,类似于 Java 中的 public 关键字;
c 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
补码:反码加 1 称为补码。
语法
- 判断语句
- if...else 语句
- switch 语句
- 循环语句
- while 循环
- for 循环
- 循环控制语句
- break 语句
- continue 语句
- goto 语句
- 无限循环
for( ; ; )
- 判断语句
函数(返回类型 + 函数名 + 函数参数 + 函数主体)
- 函数参数
- 值传递:如交换两个实际值。swap(int x, int y)
- 指针传递:如交换两个指针变量,改变了内部地址的值。swap(int *x, int *y)
- 引用传递:swap(int &x, int &y)
- 本质上说,C 里面所有的函数参数传递,都是值传递
- 根据函数能否被其他源文件调用分为
- 内部函数(static 修饰)
- 外部函数(extern 修饰,可不写)
- 内联函数:指用 inline 关键字修饰的函数,在类内定义的函数被默认成内联函数
- 函数参数
# 代码
# monday.c
#include <stdio.h> | |
#include <stdlib.h> | |
#include "utils.c" | |
/* | |
auto 存储类 | |
*/ | |
int main1(){ | |
int a = 12; | |
printf("%d\n", a); | |
auto int b = 23; | |
printf("%d\n", b); | |
return 0; | |
} | |
/* | |
register 存储类 | |
(1)register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量 | |
RAM 代表随机存取内存,ROM 代表只读内存;两者都是电脑的组件。 | |
RAM 是易失性内存,用于暂时存储正在处理的文件。 ROM 是非易失性内存,用于为电脑长久存储指令。 | |
(2)register 存储类意味着变量的最大尺寸等于寄存器的大小(通常是一个字), | |
且不能对它应用一元的 '&' 运算符(因为它没有内存位置)。意味着变量 ** 可能 ** 存储在寄存器 | |
*/ | |
int main2(){ | |
register int miles = 20; | |
printf("%d\n", miles); | |
} | |
/* | |
static 存储类 | |
(1)static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。 | |
(2)因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。 | |
(3)static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内 | |
(4)全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中 | |
*/ | |
// 下面的 count 也可以作为全局变量在函数内使用 | |
static int count = 10; | |
void doSomething(){ | |
//thingy 使用 static 修饰后,不会在每次调用时重置(为 5) | |
// 也就是说初始化工作只进行一次 | |
static int thingy = 5; | |
thingy++; | |
printf(" thingy 为 %d , count 为 %d\n", thingy, count); | |
} | |
int main3(){ | |
while(count--){ | |
doSomething(); | |
} | |
return 0; | |
} | |
/* | |
extern 存储类 | |
(1)extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。 | |
当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。 | |
(2)extern 是用来在另一个文件中声明一个全局变量或函数。 | |
(3)extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候 | |
*/ | |
int counter; | |
int main4(){ | |
counter = 5; | |
extern void write_extern(); | |
extern int pageSize; | |
extern int pageNumber; | |
printf("第 %d 页 \n", pageNumber); | |
printf("该页 %d 行 \n", pageSize); | |
return 0; | |
} | |
/* | |
算术运算符示例,输出 | |
Line 1 - c 的值是 31 | |
Line 2 - c 的值是 11 | |
Line 3 - c 的值是 210 | |
Line 4 - c 的值是 2 | |
Line 5 - c 的值是 1 | |
Line 6 - c 的值是 21 | |
Line 7 - c 的值是 22 | |
d=9, d1=10 | |
d=9, d2=9 | |
d=11, d3=10 | |
d=11, d4=11 | |
*/ | |
int main5(){ | |
int a = 21; | |
int b = 10; | |
int c ; | |
c = a + b; | |
printf("Line 1 - c 的值是 %d\n", c ); | |
c = a - b; | |
printf("Line 2 - c 的值是 %d\n", c ); | |
c = a * b; | |
printf("Line 3 - c 的值是 %d\n", c ); | |
c = a / b; | |
printf("Line 4 - c 的值是 %d\n", c ); | |
c = a % b; | |
printf("Line 5 - c 的值是 %d\n", c ); | |
c = a++; // 赋值后再加 1 ,c 为 21,a 为 22 | |
printf("Line 6 - c 的值是 %d\n", c ); | |
c = a--; // 赋值后再减 1 ,c 为 22 ,a 为 21 | |
printf("Line 7 - c 的值是 %d\n", c ); | |
int d, d1, d2, d3, d4; | |
d = 10; | |
d1 = d--; | |
printf("d=%d, d1=%d\n", d, d1); | |
d = 10; | |
d2 = --d; | |
printf("d=%d, d2=%d\n", d, d2); | |
d = 10; | |
d3 = d++; | |
printf("d=%d, d3=%d\n", d, d3); | |
d = 10; | |
d4 = ++d; | |
printf("d=%d, d4=%d\n", d, d4); | |
} | |
/* | |
关系运算符 | |
*/ | |
int main6(){ | |
int a = 10; | |
int b = 12; | |
if(a == b){ | |
printf("a 等于 b\n"); | |
} | |
if(a < b){ | |
printf("a 小于 b\n"); | |
} | |
if(a > b){ | |
printf("a 大于 b\n"); | |
} | |
if(a != b){ | |
printf("a 不等于 b\n"); | |
} | |
if(a >= b){ | |
printf("a 大于等于 b\n"); | |
} | |
if(a <= b){ | |
printf("a 小于等于 b\n"); | |
} | |
return 0; | |
} | |
/* | |
逻辑运算符 | |
*/ | |
int main7(){ | |
int a = 5, b = 6; | |
if(a && b){ | |
printf("a与b为真\n"); | |
} | |
if(a || b){ | |
printf("a或b为真\n"); | |
} | |
if(!a){ | |
printf("非a为真\n"); | |
} | |
return 0; | |
} | |
/* | |
位运算符 | |
*/ | |
int main8(){ | |
unsigned int a = 60; /* 60 = 0011 1100 */ | |
unsigned int b = 13; /* 13 = 0000 1101 */ | |
int c = 0; | |
char s[10]; | |
printf("a的二进制是 0011 1100\n"); | |
printf("b的二进制是 0000 1101\n"); | |
c = a & b; | |
printf("a & b = %d\n", c); | |
itoa(c, s, 2); | |
printf("a & b = %s\n", s); | |
c = a | b; | |
printf("a | b = %d\n", c); | |
itoa(c, s, 2); | |
printf("a | b = %s\n", s); | |
c = a ^ b; | |
printf("a ^ b = %d\n", c); | |
itoa(c, s, 2); | |
printf("a ^ b = %s\n", s); | |
c = ~a; | |
printf("~a = %d\n", c); | |
itoa(c, s, 2); | |
printf("~a = %s\n", s); | |
c = a << 2; | |
printf("a << 2 = %d\n", c); | |
itoa(c, s, 2); | |
printf("a << 2 = %s\n", s); | |
c = a >> 2; | |
printf("a >> 2 = %d\n", c); | |
itoa(c, s, 2); | |
printf("a >> 2 = %s\n", s); | |
} | |
/* | |
赋值运算符 | |
*/ | |
int main9(){ | |
int a = 21; | |
int c ; | |
c = a; | |
c += a; | |
c -= a; | |
c *= a; | |
c /= a; | |
c %= a; | |
c <<= 2; | |
c >>= 2; | |
c &= 2; | |
c ^= 2; | |
c |= 2; | |
} | |
/* | |
杂项运算符 | |
*/ | |
int main10(){ | |
int a = 10; | |
printf("%lu \n", sizeof(a)); | |
int* ptr; | |
ptr = &a; | |
printf("a 的值是 %d\n", a); | |
printf("*ptr 是 %d\n", *ptr); | |
a = 10; | |
int b = (a == 1) ? 20: 30; | |
printf( "b 的值是 %d\n", b ); | |
} | |
/* | |
条件语句 | |
*/ | |
int main11(){ | |
int a = 10; | |
if(a > 1){ | |
printf("a > 1\n"); | |
}else if(a > -5){ | |
printf("a > -5\n"); | |
}else{ | |
printf("a <= -5\n"); | |
} | |
char size = 'L'; | |
switch (size) | |
{ | |
case 'S': | |
printf("小号\n"); | |
break; | |
case 'M': | |
printf("中号\n"); | |
break; | |
default: | |
printf("大号\n"); | |
break; | |
} | |
} | |
/* | |
循环类型 | |
*/ | |
int main(){ | |
int a = 10; | |
while (a--) | |
{ | |
printf("a = %d\n", a); | |
if (a == 5) | |
{ | |
break; | |
} | |
} | |
printf("----------------\n"); | |
int b = 10; | |
do | |
{ | |
b--; | |
if (b == 5){ | |
continue; | |
} | |
printf("b = %d\n", b); | |
} while (b > 0); | |
printf("----------------\n"); | |
for (int c = 9; c >= 0; c--) | |
{ | |
printf("c = %d\n", c); | |
if (c == 5){ | |
break; | |
} | |
} | |
printf("----------------\n"); | |
int d = 4; | |
LOOP:do{ | |
if (d == 3){ | |
d = d - 1; | |
goto LOOP; | |
} | |
printf("d = %d\n", d); | |
d--; | |
}while(d); | |
return 0; | |
} |
# utils.c
#include <stdio.h> | |
extern int counter; | |
static int pageSize = 30; | |
int pageNumber = 40; | |
void write_extern(){ | |
printf("count is %d\n", counter); | |
} |