c语言基础的一些细节总结(1)
来源:互联网 发布:车间数据统计 编辑:程序博客网 时间:2024/06/06 09:20
变量定义:
必须在写一切非定义变量代码之前
如何不用第三个变量交换2个变量的值;
方法1:
int a = 10;int b = 100;a = a^b;b = a^b;c = a^b;
b = 00000000 00000000 00000000 01100100;
a = a^b= 00000000 00000000 00000000 01101110;//第一次异或
b = a^b = 00000000 00000000 00000000 00001010;//第二次异或
a = a^b = 00000000 00000000 00000000 01100100;//第三次异或
方法2:
a = a+b;
b = a-b;
a = a-b;
求10个数中的最大值最小值
//3.求10 个整数中最大值。#include<stdio.h>int main(){int i = 0;int arr[10] = {4, 5, 7, 2, 3, 89, 45, 12, 3, 78};int arrlen = sizeof(arr)/4;int max = arr[0];for(i = 0; i<arrlen; ++i){printf("%d ", arr[i]);if(arr[i]>max)max = arr[i];}printf("\n");printf("最大值为%d\n", max);return 0;}
上述代码中的max或者min应该是数组中的元素,不应该是0或者-1或者32367或者65535;++i和i++效率比较:
++i等价于i+=1;
i++等价于(int temp = i, i+=1,temp)由于逗号表达式的值是最后一个temp的值所以i++当前的值还是i;
多重for循环效率的和内外层循环次数的关系:
循环次数多的应该尽量放在内层循环里面
#include<stdio.h>int main(){int i = 0;int j = 0;int arr[2][5] = {0};int arr1[2][5] = {0};for(i = 0; i<2; ++i){for(j = 0; j<5; ++j){arr[i][j] = i;}}for(i = 0; i<5; ++i){for(j = 0; j<2; ++j){arr1[j][i] = i;}}}
首先分分别给两个for循环arr [ i ] [ j ] = i;代码处添加断点
当程序走到第一个断点处时,查看arr[ i ] [ j ]的地址变化
为0x0019ff10到0x0019ff34; 两个地址相减得到24,换算成十进制为40
如图
上图可以看出每次赋值都是对连续地址进行赋值;
再看看第二个数组地址赋值时的情况
arr1[0][0]
arr[1][0]
arr[0][1]
上图可以看出对其赋值并不是连续的,是跳着查找的,由于在地址查找时会优先把当前查找的地址的下一个地址放入缓冲区,所以第二种方法对数组赋值就比第一种慢
它的命中率为百分之0;
对于函数传参的一些总结:
函数在传递常量参数(非数组)时,会把实参拷贝一份给形参,所以以下代码并不能起到交换2个数字的作用
正确写法如下
void exchange_AandB(int* a, int* b){int temp = *a;*a = *b;*b = temp;}#include<stdio.h>int main(){int i = 5;int j = 50;exchange_AandB(&i,&j);printf("i = %d, j = %d", i, j);return 0;}
可以看出,上述写法是交换ij的地址实现了ij值的交换
运算符的一些总结
sizeof不是函数是运算符。
任何数&1可以取二进制的最低位;
求平均值的正确方法:
一般求平均值都是average = (a+b)/2
但是如果a = INTMAX;
b = INTMAX像是这样的话就会溢出无法求平均值
应该这样写:average = a - (a - b)/2,就不会溢出了;
随机数:
srand((unsigned)time(NULL));//只初始化一次才能保证每次的值不一样
trueNum = rand()%101;//在100以内取值
折半查找:
#include<stdio.h>int main(){int arr[] = {1, 8, 2, 98, 45, 78, 65, 12, 65, 69};int left = 0;int right = sizeof(arr)/sizeof(arr[0])-1;int myNum = 0;int mid = 0;printf("请输入查找的数字:\n");scanf("%d", &myNum);while(left <= right){mid = left + (right - left)/2;if(myNum == arr[mid]){printf("找到了在数组的第%d个位置\n", mid);break;}if(myNum<arr[mid]){right = mid - 1;}else if(myNum>arr[mid]){left = mid + 1;}}printf("没找到\n");return 0;}
while((ch = getchar()) != EOF)
putchar(ch);
- c语言基础的一些细节总结(1)
- C语言的一些细节总结
- C 语言的一些细节
- C语言一些细节
- C语言的一些琐碎细节备忘
- c语言的一些小细节
- 关于c语言static的一些细节
- 一些C语言语法的细节
- c语言输入输出的一些细节
- c语言的一些细节学习
- C语言细节总结
- 自己总结的一些C/C++语言基础问题
- c语言中的一些细节
- 一些语言细节(1)
- C语言 指针要注意的一些细节问题
- C语言要注意的一些小细节
- 编程实践中C语言的一些常见细节
- C语言中一些容易忽视的细节
- Maven学习总结:几个常用的maven插件
- 评估网络和主机服务对DDoS攻击的抵抗性
- 神经网络与深度学习第四周-Building your Deep Neural Network
- loopback(本地回环)接口的作用
- 决斗场
- c语言基础的一些细节总结(1)
- ETH挖矿工具之圣骑士
- 来自企业中的真实面试真题(二)
- selenium各种动态等待场景
- Spark学习笔记
- 超融合:到底是 data-locality 还是 data-ubiquity
- CSS3 投影
- echo命令的15个用法
- TensorFlow之四 ----- 面向专家的深度MNIST