扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
先介绍一下游戏背景:一个肥宅,怒闷的问自己为什么没有女生看得上为什么出生没有含着金钥匙为什么自己一无是处,于是他走上了攀登C语言圣山的无尽旅途…
在宝兴等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站建设、成都做网站 网站设计制作按需网站策划,公司网站建设,企业网站建设,成都品牌网站建设,成都全网营销推广,成都外贸网站制作,宝兴网站建设费用合理。第一篇:新手村:一望无际的C圣殿山顶。 一.新手大礼包或许是前世转世给造物主充了钱,肥宅还未踏入新手村就在路上捡到了大礼包。他打开一看,哇,暴率是真的高:
\0
为字符串的结束标志,\t
为空格\ddd
为1~3个八进制的数字()。xdd
为2个十六进制的数字,\'
为输出单引号,\"
为输出双引号。
例子:
printf("%d\n", strlen("c:\test\328\test.c"));
结果输出14。分析:共{'c', ':', '\t', 'e', 's', 't', '\328', '\t', 'e', 's', 't', '.', 'c', '\0'}
共14个字符
判断语句内为执行语句时,先执行,然后判断执行语句所操作的值(个人理解为左值优先,没有左值判断右值(虽然C语言好像没有右值概念))是否为0
例子:
int i = 0;
int k = 0;
for(i = 0, k = 0; i++, k++)
k++;
...
for循环执行了0次,因为中间为判断语句,先执行再判断,将k值赋0后,判断k的值是否为0,为0则跳出循环。这一段代码中k一直都是0,没出生过(bushi)。
这又带来了一个问题,如果判断语句中写一个没有返回值的函数,它会如何做判断呢?使用C++(QT)试了试,结果如下
生成随即数的函数int rand(void)
,来自头文件
,需要void srand(unsigned inte seed)
先设置随即生成函数的规则,输入不随程序影响,一直变换的值就能得到随机数(比如时间戳)
system()括号内跟shell命令等同于跟系统终端输入命令
strcmp函数bool strcmp(char a, char b)
比较a,b是否相同,相同返回0
例子:
n:
...;
goto n;
goto语句不能跨函数跳转。
对于多重循环要一次性跳出多个循环的时候才显的好用(其他时候不该用(不然你的领导会吃了你的)):
for(...){for(...){for(...){ ...
if(disater)
goto error;
}
}
...
error:
if(disater)
//处理错误情况
}
字符数组初始化char arr1[] = "abc";
为字符串初始化,最后会有\0
字符,所以初始化为4字符数组,最后一个值为\0
char arr2[3] = {'a', 'b', 'c'};
为传值初始化,传入3个字符参数,所以初始化为3字符数组。
查看地址值可以用%p
参数,例如printf("&arr[%d] = %p\n", i, &arr[i]);
void arr(int arr[]){int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d", sz); //1
}
int main(){int arr[10];
int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d", sz); //2
arr(arr);
}
1处打印值为1,2处打印值为10。为什么会有不同?:
int sz = sizeof(arr) / sizeof(arr[0]);
中,sizeof(arr)
中的arr不同与一般理解!arr表示的是整个数组的指针,除此之外只有&arr
也是这样,可以这么说,&arr + 1 - arr[0]
为10个元素类型长度的值而非1个。所以sizeof(arr)
没有问题。
问题在与函数声明的型参上。arr(int arr[])
本质上和arr(int* arr)
一样为指针类型,因此在sizeof()
中不认为是数组类型,因此只返回一个元素的大小。而在主函数中arr定义为数组,所以能打印出正确的值。(型参可以改为arr(&int arr[])
这样在函数内部也能认为是数组)(存疑)
例如10%3
符号两边必须为整数,不能是浮点数,返回取余后的值,操作的是二进制位
左移右移右边的值都只能是正整数,负数没有定义
左移操作符<<左边抛弃,右边补0,不赋值不会使变量发生变化。
右移操作符 >>有两种方式,取决于编译器
第一种算术右移,左边补原来位数的值(1则补1,0则补0),右边抛弃
第二种逻辑右移,左边补0,右边抛弃
位操作符 如何仅用位操作符来完成两个数的交换a = a ^ b;
b = a ^ b;
a = a ^ b;
可以这样来理解:
b = a ^ b
即为b = (a') ^ b = a ^ b ^ b = a ^ (b ^ b) = a
a = a ^ b
即为a = (a') ^ (b') = (a ^ b) ^ (a) = b ^ (a ^ a) = b
判断整数(32位)有多少个二进制位1,高级做法:(不明觉厉啊!)
whil(num){++count;
num &= (num - 1);
}
num &= (num - 1)
相当于做了判断二进制数组中最靠右的1在哪里同时去掉了比这个1更右的位数(左补齐0),进而循环判断num
就能通过循环次数得出结果。
~
对一个数的二进制位按位取反
++a (–a) 先a’=a+1,后b=a’,另一种理解为return(a+1)
a++ (a–) 先b=a, 后a=a+1,另一种理解为return a, a=a+1;
sizeof
是操作符,可以sizeof int
但是对于struct student
不适用,因为sizeof
优先级很高
&& 若左边为0,右边全忽视(当然要考虑到符号执行顺序的问题)
|| 若左边为1,右边全忽视
逗号操作符号,…,…,…;这条语句最后返回的结果为最后执行(即最后一个小语句)的结果。
算术表达式中的强制转换 整形提升按照最高位的符号位(0或1)来提升(左补齐),不足整形提升为整体(长度)。
只要参与了表达式运算(包括逻辑运算),就会发生 整形提升
寻常算术转换赋值时,赋值前的变量会尝试转换为赋值后的。
计算时,底精度的会转换成高精度的。(有符号数比无符号数精度底)
操作符的执行顺序对于考操作符的题目,就尽量按照 顺序,结合性,是否改变操作性来判断,只要结果相等,不需要完全的判断唯一路径。
但对于写代码时,不要写不能确定唯一路径的算式
例子a * b+c * d+e * f
这样只根据三原则定理是无法判断出唯一路径的
在32位系统为4字节,64位系统为8字节
指针类型的意义不同的指针类型的步长是不一样的(*p+1),这意味着不同类型的指针能操作的字节空间数的权限是不一样的。字节是地址,但对于递归时的指向性(下一个地址值指向哪里)是有指针类型决定的
指针减去指针前提是指针类型一致且处在同一块连续的空间(比如数组)
返回相隔元素的个数(可以小指针减大指针,为负数)
另:标准规定,对于比较而言,可以允许与数组最后一个元素的指针的后一个元素(指针尾)进行比较,而对于第一个元素的指针的前一个指针则没允许的规定
结构体的声明三步走:
typedef struct Stu{int num;
char name;
}Stu; //后可跟初始化,例如: = {1,"richard"}
定义:
struct Stu p1; // 初始化使用大括号
结构体传参最好传结构体指针
肥宅这真是捡到宝,拿着这个包直接闭关,十年之后又是一条好汉!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流