逻辑推理:可以看出,中间的那个人可能是“诚实的家伙”或者“说谎的家伙”或者“犹豫不决的”,这里形成悖论;根据推理,
假设中间为犹豫不决的,那么左右两边因为至少有一句是真的,而左右都没说中间是“犹豫不决的”,那么假设不成立;
假设中间为诚实的家伙,那么很显然,假设不成立;
可以推出中间为说谎的家伙,则右边为诚实的家伙,左边是犹豫不决的;
解:通过括号,可以看出后面两个是(int * (*)(int *,int*),int*)是参数
待议论
memcpy()函数内存重叠的实现:
如果目标地址大于源地址,先拷贝高位源地址。
如果目标地址小于源地址,先拷贝低位源地址。
待解答
(宏定义只是单纯地展开,此处得2*3,和3+2也没有计算,直接代入展开)
(因为在计算机系统中,数值一律用补码来表示和存储。所以uc其实是-1的补码,即11111111,而_in >>24^uc 先右移24位,得 1001 1001,再和uc进行位异或,得0110 0110可得到0x55。)
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
注意:宏定义只是展开,要谨慎把宏、参数用括号包含起来!!
凡是指针要看多少位的机器!!ss1,q3都是指针的大小;
ss2---11, q1---4 , q2---3 (自动补上’\0’);
答:Segmentation fault (core dumped) 段错误。原因:p1,p2指向常量字符串,不能对只读进行strcat操作,字符串常量内容不能被修改
解:只要是涉及到编写函数就要考虑周全,如传参是指针,就要判断是否为空,若传递是字符串,考虑传参是否是只读,内容是否可以修改。
此处的strcpy,考虑三点:
(1)不受限制的字符串函数都是以’\0’为结尾标记来判断的,因此输入参数必须包含‘\0’
(2)必须保证目标字符数组的空间足以保存整个源字符串
(3)strcpy(dest,src)函数是把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间中,而且src和dest所指内存区域不可以重叠。这就要求dest必须有足够的空间来容纳src的字符串
参考代码:
char* my_strcpy(char *dest,const char *src)
{
char *cp=dest;
assert(src && dest);
while(*dest++ = *src++); //或者while((*dest++ = *src++) != ‘\0’);
//执行完这句话,那个‘/0’也已经赋值啦,
return cp;
}
---------(函数的调用如何传参、如何传递返回值、如何返回到函数执行的下一条地址!!)
----------(如何判断大小端!!)
3.写一个函数计算long变量有多少位的bit值为1:
(此处参考int的做法,喜欢第2种,但效率不高,适当修改即可,应该是吧,实在不行就for循环sizeof(long)次吧,嘿嘿。。)