条件操作符
也叫三目运算符 表达式为exp1?exp2:xep3,用法是表达式1结果若为真,则表达式二计算,否则表达式三计算。
int main() { //求两个数中的较大值 int a = 3; int b = 5; int m = 0; scanf("%d %d", &a,&b); m=(a > b? a:b);//若a大于b,则m=a.否则m=b; /*if (a > b) { b = a; }else { m = b; }*/ printf("%d\n", m); return 0; }
逗号表达式
表达式 为exp1,exp2,exp3......expN,逗号表达式会从左到右依次计算,整个表达式的结果是最后一个表达式的结果。
int main() { int a = 2; int b = 3; int c = 0; int d = (a += 3, b -= a, c = a + b, c - 2);//从前往后算,最后一个为表达式的结果。 printf("%d", d);//1 return 0; }
这里的结果只看c-2,c带入前面的式子计算得到。
[]下标引用操作符,()函数调用操作符
int main() { int arr[10] = { 1,2,3,4,5,6,7,8 };//不完全初始化。剩余元素默认初始化为零 printf("%d\n", arr[8]);//这里的方块[]是下标引用操作符,引用数组中的元素。 //函数调用操作符 int len = strlen("abc"); printf("%d\n", len);//这里的()就是调用函数时,调用函数操作符 return 0; }
这两个就是平常用法,不做作赘述。
常见的关键字
c语言中有许多关键字,他们已经被预设好,无法自己创建。
auto 对于局部变量,自动创建,自动销毁,本质就是一种自动变量,这种变量前面是有auto来修饰的,后来省略不写。比如 int a=4;即为auto int a=4;
break;用于结束循环,在switch语句中结束循环
case 在switch case 语句中充当循环条件
类型都是关键字。short int float long const 等
continue跳出本次循环,但不结束循环。
default 默认的意思
do 用于do while 循环 for循环
enum 枚举,自定义类型
union 联合体
struct 结构体
extern 声明外部符号
goto 可实现分支或循环的语句
register 寄存器
return 函数中返回结果
signed 有符号的 对比 unsigned 无符号型 比如定义年龄(只能是正整数,无符号类型) unsigned int age;
sizeof 计算l类型内存大小
static 静态修饰变量
typedef 类型定义
void "无"类型
这里说几个常用的
typedef
类型重定义 ,给类型重新取外号
typedef unsigned int uint; // 类型的重定义,uint=unsigned int //一个结构体的重定义 int main() { unsigned int num1 = 10; uint num2 = 10; return 0; } typedef struct Node { int data; struct Node* next; }NODE;
对于该结构体,被重新定义为NODE ,创建结构体时可直接NODE a,创建一个结构体a。
static
意思为静态的,静态修饰。作用是:1.修饰局部变量。2.修饰全局变量 3,修饰函数
1.修饰局部变量
void test() { //int a = 5; //static int a=5 a++; printf("%d", a); } int main() { int i = 0; while (i < 10) { test (); i++; }//调用十次 打印十个6 //加上static 打印6到15 return 0; }
static 修饰局部变量 变量进入下一次运算前保留当前的值,改变了它的生命周期。
内存被划分为几个区域,栈区,堆区,静态区。在栈区中的变量,进入作用域创建,出了作用域销毁,是一种临时的状态。
若一个变量被static修饰,他是一个静态变量储存在静态区,静态变量(全局变量就在静态区)创建好后,只有当程序结束时才销毁,出了作用域不会被销毁。而在堆区是动态开辟的空间存储的变量。
故static修饰局部变量,本质上是改变了变量的存储类型,导致他生命周期的变化,但是不影响作用域。
2.修饰全局变量
这里未用static修饰全局变量,可以被外部源文件声明后使用。
int main() { extern int g_val;//声明来自其他源文件的全局变量 printf("%d", g_val);//报错,无法解析的外部符号 return 0; }
全局变量是具有外部链接属性,通过链接。在其他源文件里找到该变量
若加了static修饰后,将外部连接属性变成了内部连接属性,即在其他源文件里看不到该变量,其他源文件链接不到该变量,变量只作用此前的.c文件当中。
可以理解作用于变小了,本质改变了链接属性。
3.修饰函数
int ADD(int x, int y) { return x + y; } //这里定义的函数拥有者跟全局变量类似的作用域,该函数也可以通过外部声明在别的源文件里使用 int main () { int a = 10; int b = 20; int ret = ADD(a, b); printf("%d", ret); return 0; }
若用static修饰
关键字#define
定义常量和宏。
#define M 1000 //#define定义的宏是有参数的 #define ADD(x,y) ((x)+(y)) //定义求和 宏 int main() { int a = M; printf("%d", a);//打印 int a = 10; int b = 20; printf("%d", ADD(a, b)); return 0; }
宏和函数很相似。但还是存在区别。这里定义宏时,所定义的传参后宏替换括号里的内容 即ADD(x.y)->ADD(a+b),一般书写习惯也不一样,宏定义的一般都是大写,函数不全是大写
指针
1.内存
内存是电脑特别重要的存储器,计算机中程序中的运行都是在内存中,内存空间:如4GB 8GB 16GB等都是挺大的内存空间,如何管理内存?
内存被划分为一个个内存单元,为了找到对应内存单元区域进行编号,一个内存单元大小为一个字节,如32根地址线通过电流产生0 1这样的二进制序列,共有2的32次方,以这种方式生成编号来存储共4GB内存大小。
内存单元的编号如同门牌号,也叫地址,在c语言中,又叫指针。
创建变量需要申请空间,申请对应类型或变量的内存大小,创建指针变量可以存取地址。
int main() { int a = 10; //定义指针变量存放地址 int* pa = &a;//指针变量:类型 * 变量名称 *pa;//这里的*是解引用操作,通过地址找到本身,即变为a; //* 与&可以想象是两个对立的,取地址与解引用 //也可以通过改变指针变量改变本身 *p = a; return 0; }
注意地址的大小是四(32位平台)/八个字节(64位平台)
结构体
用来描述一个拥有多种类型数据复杂的对象,将多种类型的数据结合在一起。如书,有书名,价格,编号,出版社等.
struct book { char name[20]; int price; }; int main() { struct book a = { "c语言",55 }; struct book b = { "数据结构",60 }; //打印方式 printf("书名:《%s》\n定价:%d", a.name, a.price);//通过.操作符找到结构体的成员。 //若为地址 struct book* c = &b; printf("书名:《%s》\n定价:%d",c->name, c->price);//通过->,指针访问结构体成员。 return 0; }
struct +结构名称
{
类型1+数据名;
类型2+数据名;
类型3+数据名;
};