#随时更新,随时记录
***************************************************************************************************************************************************************************************************************Python中的 any 函数:any(iterable) -> bool
return True if bool(x) is True for x in iterable; 遇到 True 就直接返回了,不一定会执行到末尾~
any(map(lambda x: x > 0, l))
判断列表 l 中是否有大于 0 的元素
************************************************************************
char s[] = {"abcd"}
char *s = "abcd"
二者的区别,前者是数组,数据存在堆栈区,没有手动指定,系统自动分配,所以在栈里,内容可变,后者是一个常量,数据存在常量区,内容不可变,
如果是在子函数中,前者是不可以返回的,因为栈被销毁了,后者是可以返回的,因为常量区在程序退出时才销毁;
**********************************************************************
DNS 查询过程(www.1.com.cn):
本地缓存,ROOT DNS;.CN DNS,.COM.CN DNS,1.COM.CN DNS,返回失败~
*********************************************************************
输入一个整数,输出这个整数的二进制里,有多少个“1”
int cnt = 0;
for(; b; b>>1){
if(b&1)
++cnt;
}
***********************************************************************
Python 中 list 的排序,可以用 list 的成员函数 sort ,也可以用内置函数 sorted,其中,sorted 是新生成了一个列表,sort 是在原来的列表的基础上更改,
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
其中,iterable 是待排序的对象,cmp 是比较规则,key 是用于比较的关键字, reverse 可以是 True 或 False,
其中 cmp 和 key 可以用 lambda 表达式;
L = [ ('a', 10), ('b', 9), ('c', 8), ('d', 7) ]
sorted(L, cmp = lambda x, y:cmp(x[1], y[1]) )
sorted(L, key = lambda x: x[1] )
两种方式都可以得到依据第二个元素排列的结果,
如果希望在第二个元素相同时,依据第一个元素来排列,那么:
sorted(L, key = lambda x: (x[1], x[0]) )
******************************************************************************************
C 中的整形提升:
在进行数值运算时,如果参与运算的 两个操作数 不是同一类型的,会进行类型转换,转换的基本规则是向着 精度高,位数长 的那种类型转换,在 ANSI C中,如果能用 signed 表示,就用signed,否则就用 unsigned,不同于 K&R C采用的 无符号保留 的规则;
对于浮点数,如果有一个是 long double,那么结果肯定是 long double,没有比它更长的类型了;转换的方向就是 float --> double --> long double,如果是一个浮点数和一个整形,那么结果肯定是朝着浮点数的方向转。
PS:double 和 float 不能用 unsigned 和 short 修饰,float 还不能用 long 修饰;
对于整形,如果 int 能完整的容纳之前的数据,那么 char,short,位段类型,枚举enum,都会被转换为 signed int,否则转换为 unsigned int;如果有一个是 long,且 long的范围 大于 int(一般机器上都是等长的),则转换为 long,所以说如果有:
int a = -10;
unsigned int b = 5;
printf("%d\n", a+b);
输出会是一个很大的值,因为 int 被转化为 unsigned int,其实还是遵照 向着精度高,位数长 的方向转化的原则;
在函数参数传递时,实际上也会发生类似的情况,比如 printf 函数,对于 char,short 都可以用 %d 来输出,因为char,short 在传入时,已经被提升为 int;
另一个隐藏的情况是:
对于
char a, b, c;
c = a+b;
实际上等同于:
c = (char)( (int)a + (int)b )
这也是整形提升的杰作,可以验证:
char a, b;
pritf("size of result of (a+b) : %d\n", sizeof(a+b) );
输出的结果实际上是 4;