Linux C 各操作符优先级

C语言中的操作符:
优先级 符号 名称 结合性
———————————————————————
1 [] 数组取下标 左结合性
1 () 括号、函数调用 左结合性
1 . -> 取结构和联合的成员 左结合性
———————————————————————
2 ++ 自增 右结合性
2 — 自减 右结合性
2 & 取操作数地址 右结合性
2 * 间接寻址
与指针一起使用 右结合性
用于访问指针所指向的值
2 + 一元正号 右结合性
2 – 一元负号 右结合性
2 ~ 按位求反 右结合性
2 ! 逻辑非 右结合性
2 sizeof 计算所需空间(字节) 右结合性
———————————————————————
3 () 强制类型转换 右结合性
———————————————————————
算术运算符
4 * / % 乘除取余运算符 左结合性
5 + – 加减运算符 左结合性
6 << >> 移位(针对整型) 左结合性
———————————————————————
关系运算符
7 < > <= >= 关系运算符 左结合性
8 == != 判等运算符 左结合性
———————————————————————
逻辑运算符
9 & 按位与 左结合性
10 ^ 按位异或 左结合性
11 | 按位或 左结合性
12 && 逻辑与 左结合性
13 || 逻辑或 左结合性
———————————————————————
14 ?: 条件表达式 右结合性
———————————————————————
15 = *= /= %=
+= -= <<= >>=
&= ^= \= 赋值、复合赋值 右结合性
———————————————————————
16 , 逗号 左结合性

注:
* 左值: 能出现在赋值符号左边的内容,左值意味着一个位置
* 右值: 能出现在赋值符号右边的内容,右值意味着一个值
* 一般变量可以作为左值,而表达式不能
逻辑和算术移位:
正数 负数
——————————————————————
逻辑左移 低位补0高位丢失 低位补0高位丢失

算术左移 同上 同上
——————————————————————
逻辑右移 高位补0低位丢失 高位补0低位丢失

算术右移 高位补0低位丢失 高位补1低位丢失

注: 在右移中对于负数到底是采用逻辑右移还是算术右移取决于编译器(gcc采用算术右移)
类型转换:
1) 隐式转换
* 定义: 编译器可以自动处理这些转换而无需程序员介入
* 发生隐式转换的场合
a) 当算术表达式或逻辑表达式中的操作数类型不相同时(常用于算术转换)
b) 当赋值运算符右侧表达式的类型和左侧变量的类型不匹配时
c) 当函数调用中的实参类型与其对应的形参类型不匹配时
d) 当return语句中表达式的类型和函数返回值的类型不匹配时
* 常用算术转换
数据类型提升
a) int –> unsigned int –> long int –> unsigned long int
b) float –> double –> long double
c) 整型 –> 浮点型
d) 有符号数 –> 无符号数

2) 强制类型转换(显式转换)
* 定义: 允许程序员使用强制运算符执行转换
* 语法: (类型名)表达式

Linux C 学习笔记 八

1、if语句
* 在C语言中1表示true,0表示false
* else子句从属于最靠近它的不完整的if语句
* 空语句用”;”表示

2、while语句
* break: 终止循环,用于switch、for、while、do_while
* continue: 终止本次循环,用于for、while、do_while

3、do_while语句
* do{
语句
}while(表达式);
* 测试在循环体执行后才进行,可保证循环体至少执行一次

4、for语句
* for(expression1; expression2; expression3) statement
* expression1: 初始化部分,在循环开始时执行一次
* expression2:条件部分,在循环体每次执行前都要执行一次
* expression3:调整部分,在循环体每次执行完毕,在条件部分即将执行之前执行
* 三个表达式都可以省略,如果省略条件部分,表示测试条件始终为真
* for语句要在C99中编译: gcc -std=c99 -o bin/for src/for.c
* for(;;) –> 无穷空循环
;

5、switch语句
* switch(expression)
case
* expression: 结果必须是整型
* 多个case执行同一组语句
case1:
case2:
case3: 语句
* case中的语句结束之前要加break,否则后面的case还会被执行,default子句可以出现在任何
位置,但一般放置在最后,建议在default子句后面也加上break。

 

指针与指针变量

变量的地址称为指针。

Kolourpaint绘图板

用于存储指针的变量称为指针变量

指针变量用于存储变量的地址

指针变量的值就是变量的地址。

指针变量专门用来存放地址,不能将其它任何非地址类型的数据赋给一个指针变量

一个指针只能指向同一种类型的变量。

Char *str=”hello” //不能修改str 因为指向的是code区的地址,不能随便修改code

 

指针运算 –偏移量

指针变量做算术运算时,在内存空间内所移动的字节长度

+ – ++ –

 

长度由指针类型所决定

int * → sizeof(int)

float * → sizeof(float)

char * → sizeof(char)

 

当出现多种类型

char *pc=&ch;

int *p = pc +1;

偏移量由操作类型决定,与赋值类型无关。

 

指针和指针运算(减法)

运算结果并非指针地址相减后在内存中所相差的偏移量,而是在元素相差的个数

数组的指针

所谓数组的指针是指数组的起始地址

数组元素的指针是数组元素的地址

规定数组名代表数组的首地址,即第一个元素的地址

数组指针

专门用来变量二维数组,

int (*ap)[n];

n为所要遍历的数组第二个下标长度

1、偏移量

2、ap与*ap的区别

 

二维数组数组名+1,跳转一行数组所占的空间长度。

Int array[5][7];

array+1 → 跳转 7 *sizeof(int)=28

 

*+二维数组数组名+1(*array+1),表示在行内跳转一个数组元书的空间长度

*(array+1)+1—> 跳转一行,再跳转一个元素 <==> &array[1][1]

 

int array[5][6];

int (*ap)[6] =array;

**ap+1 [0][0]+1

*(*ap+1) [0][1]

*(*ap+1)+1 [0][1]+1

*(*(ap+1)+1) [1][1]

**(ap+1)+1 [1][0]+1

 

指针与字符串

指针数组

#include<stdio.h>

int main(void)

{

char *week[]= //指针数组

{

“Monday”,

“Tuesday”,

“Wednesday”,

“Tursday”,

“Friday”,

“Saturday”,

“Sunday”

};

 

int dow;

char *date=NULL;

int ch;

do{

printf(“Please input day of week:”);

scanf(“%d”,&dow);

switch(dow)

{

case 1:

date = week[0];

break;

case 2:

date = week[1];

break;

case 3:

date = week[2];

break;

case 4:

date = week[3];

break;

case 5:

date = week[4];

break;

case 6:

date = week[5];

break;

case 7:

date = week[6];

break;

default:

date = NULL;

break;

}

if(date)

{

printf(“day is:%s\n”,date);

}

else

{

printf(“Unknow this day\n”);

}

printf(“continue?(1\\2):”);

scanf(“%d”,&ch);

}while(ch==1);

return 0;

}

 

 

二级指针:指向指针的指针

int *p;

int **pp;

pp——>*pp——>**pp

Linux C 学习笔记 七

数组名作为函数参数传递时

写法:

int print_array(int arrar[],int lem)

{

//////

}

array在函数内部表示数组地一个元素村的地址,(首地址)地址类型为指针。

早上在钓鱼没记笔记。

 

在二维数组计算指定元素位置时

 

字符串链接

strcat(char* des,char* src);

strncat(char* des,char* src);

字符串查找

char* strchr(char *des,char c); //找到后返回后面的串,没有找到放回null

char* strrchr(char *des,char c); //反向查找,返回也类似,只是查找方向不同

子串查找

char* strstr(char* str,char* src); //查找子字符串,返回子串的地址

查找字符的前缀

int strspn(char* des,char set[]); //去集合set里面找,有字符匹配则+1,没有就 //结束,从地一个开始

查找从字符集中出现的地一个字符后的串

char* strpbrk(char* des,char set[]) ;

 

字符串是一个或多个字符的序列
字符串不是一个数据类型,而是一个数据结构,通过数组实现

字符串函数:string.h
获取字符串长度:
int strlen(const char* string)
字符串拷贝:
char* strcpy(char* des,char* src)
char* strncpy(char* des,char* src,int size)
字符串比较:
int strcmp(const char* str1,const char* str2)
int strncmp(const char* str1,const char* str2,int size)
1)如果两个字符串相等,返回值为0
2)如果第一个参数小于第二个参数,返回值小于0
3)如果第一个参数大于第二个参数,返回值大于0
字符串连接:
char* strcat(const char* str1,const char* str2)
char* strncat(char* str1,const char* str2,int size)
字符串中查找字符:返回查找到字符的指针或NULL
char* strchr(const char* string,int ch)
char* strrchr(const char* string,int ch) //反向查找
字符串中查找子串:返回查找到子字符串的指针或NULL
char* strstr(const char* string,const char* substring)
查找字符串前缀:
int strspn(const char* str,const char* set)
返回str起始部分匹配set中任意字符的字符数
char* strpbrk(const char* str,const char* set)

那些我们忘却自己过失

冲这么一句“尼玛,又不关灯,电费不要钱啊!”,或许有时候我们总是会习惯性的关注着别人的过失,却忘却了自己也经常如此,然后却永远也不会记得自己当时为什么没有人说?然后默默看着自己的过失,别人帮忙挽救却一句话没说,或者有的只是善意的小玩笑。人嘛,有时候总是会不小心忘记一些东西,或者做错一点事情,然而很多人只记得了那些你做错的和你的过失,而忽略了你之前所做的一切好的东西,包括我自己也不例外。当然,能写出来,并不代表我自己做得很好,只是觉得不爽而已。

有些时候,当别人问我们问题的时候,或者说是当我们努力的去与别人争论一个问题的时,是否觉得自己貌似看起来很懂的样子?到底是不是这样呢?或许还真不是这样,当别人问自己问题的时候,总是试着想帮助别人解决问题,然后却忘却了其实自己也不是很懂那些问题,甚至是自己根本就不知道,或者说是根本就解释不了,然而在我们回答的时候却总是万般的找各种自己学过的知识,各种混答,硬是要回答那么一两句,终归一句就是即使自己不懂也要说那么两句。不懂就是不懂,不懂我们就直接说不懂,我回答不上来,或许这样还好点,好过我们各种找各种理由回答,害怕丢面子。

以上所说皆为个人观点,即时心情,我自己也不一定能做到。看着不爽可以喷!

1 10 11 12 13 14 20