操作符
算术操作符:
/为除运算符 %为求模运算符
24/7;24为被除数,5为除数。 24/5=4.....余数为4 所以 24%5=4
float c = 10 / 3.0; //int double-> double 3.333333
printf("%f\n", c);
float c =10 % 3 ;//求模运算符两边必须为整数。
当结果要求出现小数时,两边的数至少一个为小数才行 10.0或3.0。
取模运算符两边必须为整数。
移位运算符:
移动的是二进制位,必须把十进制转换为二进制才可以使用(后续会讲)
位操作符:
也是对二进制位进行操作。
单目操作符:
单目操作符只有一个操作数的操作符。如a+b,是两个操作数
int a = 10;
//int b = ++a;//前置++,先++,后使用
//a=a+1;b=a;
int b = a++;//后置++,先使用,后++
//b=a;a=a+1;
printf("a=%d b=%d\n", a, b);//11 10
int a = 10;
//int b = --a;//前置--,先--,再使用
printf("a=%d b=%d\n", a, b);// 9 9
int a = 10;
int b = a--;//后置--,先使用,再--
printf("a=%d b=%d\n", a, b);//9 10
强制类型转换
当计算时两个整型相除则需要对一边的整型进行强制类型转换为float,才能得到小数,否则得到整型
int a = (int)3.14;//强制类型转换
printf("%d\n", a);
关系操作符
条件操作符
int a = 3;
int b = 5;
int m = 0;
if (a > b)
m = a;
else
m = b;
//一个意思
m = ((a > b) ? a : b);
如果exp1值正确则m的值为exp2 否则为exp3
逗号表达式
最后一个表达式是d的值
下标引用
int arr[10] = { 1,2,3,4,5};
[]就是下标引用操作符
[]的操作数是arr和4
printf("hello");//()就是函数调用操作符
()的操作数是函数名printf,第二个就是"hello"
int m = Max(2, 3);
()的操作数是Max,2,3
总结:
以下网站总结了C语言的优先级和结合性易错点
请移步网站:http://c.biancheng.net/view/161.html
常见关键字
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
这些关键字都是语言提前设定好的,用户不能直接创造关键字
auto
自动变量,主要功能是:进入该变量代码块时生成离开代码块时销毁,局部变量本来就有这个功能,因此auto本来是应该 aotu int sum;只是省略掉了。
default
switch中case都不成立时执行的语句
define
#define 标识符 常量 //注意, 最后没有分号
宏定义常量:
//define定义标识符常量
#define MAX 1000
宏定义函数:
定义函数时define 函数名 (变量名) 计算表达式(计算表达式每个变量一定要单独括号括起来,要不然会出现以下情况)
错误做法:
正确做法:
enum
枚举变量本质上是define的另一种形式。
#define 标识符 常量 //注意, 最后没有分号
#define valueName1 1
enum typeName{ valueName1, valueName2, valueName3, ...... };
enum是一个新的关键字,专门用来定义枚举类型。typeName表示枚举类型的名字;valueName1,valueName2.。。。是每个值对应的名字列表(注意,最后的;不能少)
当没给valueName1这些赋值时默认从0开始递增。
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
这时enum week相当于数据类型,因此可以定义 enum week a,b,c;
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
也可以在定义枚举类型时同时定义变量。
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
enum week a = Mon, b = Wed, c = Sat
有了枚举变量就可以把列表中的值赋给他。
注意两点!
一:枚举列表中的Mon Tues Wed这些标识符的作用范围是全局的,不能再定义与它们名字相同的变量。
二:Mon Tues Wed等都是常量,不能对它们赋值,只能将它们的值赋给其他变量。
static
一:当用在局部变量时
#include <stdio.h>
int sum(int a)
{
int c = 0;
static int b = 3;
c += 1;
b += 2;
return (a + b + c);
}
int main()
{
int i;
int a = 2;
for (i = 0; i < 5; i++)
{
printf("%d,", sum(a));
}
}
二:当用在全局变量时
当全局变量前加了static时,这个全局变量只能在这个源文件中使用不能在另一个源文件使用。
三:当用在函数时
static总结
typedef
类型重命名
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0; }
register
寄存器关键词
计算机有一种存储器是集成在CPU上的叫寄存器(cpu和寄存器之间进行独显 资料交换 寄存器将资料传给cpu进行处理后显示还给寄存器)
编译和链接
多个源文件.c 可以产生一 一对应的obj目标文件,obj目标文件进行链接(打包)后才会形成可执行程序.exe(详细解释请看网站:http://c.biancheng.net/view/1736.html)
指针
内存
内存是计算机的存储器,计算机的程序都在内存中运行的,每个内存单元是一个字节,每个单元都有相应的地址。
int num = 10;
#//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的
一个变量四个字节有四个地址一般打印出的是第一个地址。
该变量地址需要指针进行存储
int num = 10;
int *p = #
//*p=10 p=&num
指针前面的数据类型取决于他执行的对象类型
指针自身也占内存,所占字节取决于32位还是64位机器。不管他所执行的对象是char 还是double 也不会影响到他本身占内存所需字节。
结构体 struct
struct Stu
{
char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
}