学习C语言第四天(基础)

sizeof() 算类型长度
int a=10;
int arr[]={1,2,3,4,5,6}; [ ]里面写的 就是这个数组的个数 而个数多少可以从后面{}知道
所以【】里面的数可以不写

printf("%d\n",sizeof(a)); 这个就是a的大小 大小是4字节 因为他是整型
printf("%d\n",sizeof a ); 和上面的一样 sizeof() 里面的字符的 可以不写()
printf(“%d\n”,sizeof(int)); 算出的是整型的 大小 大小是4个字节 这里的()就不能不写
printf(“%d'\n”,sizeof(arr));算出的就是这个数组的整个大小 大小是24 因为里面一个数字是4个字节 6个数字就是24个字节
printf(“%d\n”,sizeof(arr)/sizeof(arr[0]) 输出6
学习C语言第四天(基础)

~ 按(二进制)位取反
int a=0 4个字节 32个bit 000000000000000000000000000000000000000000000000000
二进制里面的数字 最前面的数字是叫做符号位

int b=~a b叫做有符号的整型 按位取反后为 最前面的1叫做符号位 0就是+ 1就是 - 111111111111111111111111111111111111111111
原码 反码 补码
负数在内存中存储的时候,存储的是二进制的补码 打印的是原码
b就二进制码里面的 最前面的是1 即它是负的 那么它在存储的时候它用的就是补码
反码和补码之间的关系是 反码+1就是补码 而反码和原码就是取反 但是最前面的数字不变

只要是整数 内存中存储的都是二进制的补码
正整数 原 反 补 三码统一
负数是
printf(“%d”,b) 输出-1

学习C语言第四天(基础)

++ 前置加加 后置加加
int a=10
int b=a++ 后置加加,先使用,再加加
printf(“a=%d b=%d\n”,a,b) 输出的就是11 10

如果int b=++a 前置++,先加加 后使用输出11 11

int b=a-- 后置减减 输出9 10
int b=--a 前置减减 输出9 9

(类型)强制类型转换
int a=3.14 int a=(int)3.14
return 0 会报错误 这里就不会报错了 这个(int)就表示强制转换 把3.14转换 成整型

学习C语言第四天(基础)

关系操作符
<= >= != ==
用来测试不相等 用来测试相等

学习C语言第四天(基础)

逻辑操作符
&& 逻辑与
int a=3
int b=5
int c=a&&b a为真 b也为真 所以c为真 所以输出C是等于1
|| 逻辑或

int c=a||b a为真 或者b为真 c就直接是真 输出c为1
学习C语言第四天(基础)

条件操作符
exp1?exp2:exp3 这是一整个表达式 如果exp1? 为真 那么exp2执行 它的结果就是整个表达式的结果
这个也是三目操作符 如果exp1?为假 那么exp3执行 它的结果就是整个表达式的结果
int a=10
int b=20
int max=0
if (a>b) if后面的东西直接变成这样 max=(a>b?a;b)
max=a
else;
max=b
学习C语言第四天(基础)

逗号表达式
exp1,exp2,exp,。。。。expN

下标引用 函数调用和结构成员
【】 () , ->
int arr[10]={0}
arr[4] 下标引用操作符
int add(int x, int y)
int z=0
z=x+y
return z
int a=10
int b=20
int sum=add(a,b)调用了 函数add
学习C语言第四天(基础)

常见关键字 定义的符号都不能和关键字冲突 (规定的)
auto (自动) break case char const continue default(默认)do double else enum extern(引入外部符号) float for goto if int long reguster (寄存器)return short signed sizeof static struct (结构体关键字)switch typedef(定义) union(联合体、共用体) unsigned void volatile while

auto
int a=1 前面是有个auto的 表示a这个整型在这个 { } 里自动出现 然后自动消失 以为int前面都有auto 所以都省略了
break 经常用在循环语句
register 寄存器
int a=1 因为将来我会频繁用到a 所以我要把它放在寄存器里面 让它成为一个寄存器变量
register int a=1 这个时候还只是建议把a放在寄存器里面去 最终到底是不是在寄存器里面要看编译器

int 定义的变量是有符号的 int和 signed int 是等价的
只是我们平时省略了 signed
如果我们写 unsigned int a=2^32 那么即使-1是负的 但是因为你写了unsigned 所以它是无符号数的 即它在存储的时候它是用原码进行存储的

typedef 类型定义 -类型重定义
unsigned int a=1
可以写成 typedif unsigned int u int
u int a=1 从这里以后 要用到 unsigned int 都可以直接写成 u int
学习C语言第四天(基础)
static 修饰局部变量 修饰后局部变量生命周期变长
修饰全局变量 修饰后全局变量作用域变小
修饰函数 修饰后改变它的链接属性 从外部链接属性被变成为内部链接属性
void test()
{
static int a=1 a就是一个静态的局部变量
a++
printf(“a=%d\n”,a)
int main()
{
int i=0
while (i<5)
{
test()
i++
}
return 0
}

如果没有static 输出的就是2 2 2 2 2 有了static 2 3 4 5 6
静态的局部变量的意思就是出了它的作用域后 还是存在 不销毁
学习C语言第四天(基础)

在源文件里面再建一个C++ 在里面打上全局变量
int a=10 在同一个源文件另一个C++里面一样能用
只要打 extern int a就能用了
在一个C++里面打的是
static int a=10 那么再同一个源文件的另一个c++里面是不能使用的
因为static缩小了全局变量的作用域

在源文件里面再建一个C++ 在里面打上一个函数 Add()
在同一个源文件另一个C++里面打上extern int Add() 之后就能用了
而要是在源文件里面再建一个C++ 在里面打上一个函数 static Add()
那么在同一个源文件另一个C++里面打上extern int Add() 之后就不能用了
因为static改变了函数的链接属性

define 定义标识符常量
define max 1000
difine 可以定义宏-带参数
define ADD(x,y)((x)+(y))宏和函数差不多 但有所区别

printf(“%p\n“,&a) 打印地址 打印出的是16进制
int a=10
int p=&a 这种变量是用来存放地址的指针变量
int
是p的类型
解引用操作符
p对p解引用操作找到p所指向的对象a
*p=20 把找到p所指向的值a 变成20

内存里面是有编号的
32位里面有 2^32个编号二进制数就是编号
64位里面有 2^64个编号二进制数

如果一个内存里面的一个小格子大小是字节 它的编号就是上面说的编号
int a=10 a的大小就是4个字节 那么他们就会占用了内存里面的4个字节
而a的地址编号就是 4个字节里面最后面的字节的编号

猜你喜欢

转载自blog.51cto.com/14982478/2545539