一、可变参数列表

1. Q:为什么调用printf前必须要包含<stdio.h>?

A:为了把printf的正确原型说明引入作用域。例如,如果可变参数的调用比固定参数的调用效率低,编译器就可能这样做。所以在调用可变参数的函数前,它的原型说明必须在作用域内,编译器由此知道要用可变参数调用机制。

2. Q:怎样写一个接受可变参数的函数?

A:用<stdarg.h>提供的辅助机制。(有待研究)

二、风格

1. Q:用if(!strcmp(s1, s2))比较两个字符串是否相等是个好风格吗?

A:这并不是个很好的风格。如果两个字符串相等,这个测试返回真,但!(“非”)的使用容易引起误会,以为测试不相等情况。

三、杂项

1. Q:程序在执行之前就崩溃了! 用调试器单步跟踪,在main函数的第一个语句前就死了,为什么?

A:也许你定义了一个或多个非常大的局部数组(超过上千字节)。许多系统的栈大小是固定的,即使那些自动动态分配栈的系统(如UNIX)也会因为一次性要分配大段栈而困惑。通常最好将大数组声明为static或使用malloc动态分配。

也可能你的程序连接得不对(连接了用不同的编译选项编译的目标模块或者错误的动态库),或者因为某种原因运行时动态库失败了,或者你把main声明错了。

2. Q:怎样从函数返回多个值?

A:(a)可以传入多个指针指向不同的地址,让函数填入需要返回的值; (b) 让函数返回包含需要值的结构; (c) 让函数接受结构指针,然后再填入需要的数据;(d) 迫不得已的时候,可以使用全局变量。(但这并不是好主意)

3. Q:怎样判断机器的字节顺序是小端序还是大端序?

A:

// method 1: use pointer
int x = ;
if (*(char *)&x == )
printf("little-endian\n");
else
printf("big-endian\n"); // method 2: use union
union U {
int i;
char c[sizeof(int)];
};
U u;
u.i = ;
if (x.c[] == )
printf("little-endian\n");
else
printf("big-endian\n");

《你必须知道的495个C语言问题》读书笔记之第15-20章:浮点数、风格、杂项的更多相关文章

  1. 你必须知道的495个c语言问题(笔记)

    1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit    4byte char 8b ...

  2. 你必须知道的495个C语言问题,学习体会一

    C语言作为一门古老的语言,其灵活性和容易出错都让人 又爱又恨,书籍<你必须知道的495个C语言问题>,使用问答的形式,告诉读者 C语言使用的各个方面的知识,包括一些冷知识等.以下,我要摘录 ...

  3. C语言学习书籍推荐《你必须知道的495个C语言问题》

    萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中 ...

  4. 《你必须知道的495个C语言问题》知识笔记及补充

    1. extern在函数声明中是什么意思? 它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里.但在 extern int f(); 和 int f(); 之间并没有实质的差别. 补充:e ...

  5. 你必须知道的495个C语言问题,学习体会四

    本文,我们来学习下指针,这是个梦魇啊.无数次折磨着C语言学习者,无数次的内存泄露,无数次的访问失败,无数次的越界溢出, 这些错误造就的仅仅是一个 跟随者,真正的优秀者必须要正视语言的局限,同时在最大限 ...

  6. 你必须知道的495个C语言问题,学习体会三

    本文是 本系列的第三篇,本文主要对C语言的表达式做个小结 先从两个坑爹的表达式说起:i++ 与++i 上大学的时候,学长告诉我,这两个表达式,意义是一样的,后来老师纠正说,还是有区别的,于是让我们记住 ...

  7. 你必须知道的495个C语言问题,学习体会二

    这是本主题的第二篇文章,主要就结构体,枚举.联合体做一些解释 1.结构体 现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗. 我们很容易定义一个结构体,比如学生: st ...

  8. 《你必须知道的495个C语言问题》读书笔记之第11-14章:ANSI C标准、库函数、浮点数

    一.ANSI C标准 1. ANSI向C语言预处理器引入了几项新的功能,包括“字符串化”操作符(#).“符号粘贴”操作符(##).#pragma指令. 2. Q:char a[3] = "a ...

  9. 《你必须知道的495个C语言问题》读书笔记之第8-10章:字符串、布尔类型和预处理器

    一.字符和字符串 1. Q:为什么strcat(string, '!')不行? A:strcat()用于拼接字符串,所以应该写成strcat(string, "!")." ...

  10. 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针

    1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...

随机推荐

  1. keepalived+lvs+nginx高可用

    环境说明: IP地址 部署应用 192.168.10.100 VIP0 192.168.10.101 VIP1 192.168.10.17 keepalived+lvs 192.168.10.16 k ...

  2. spring boot项目接入xxl-job

    关于分布式任务调度平台XXL-JOB,作者 许雪里 在其发布的中文教程中已经介绍的很清楚了,这里就不做过多的介绍了.按照文档搭建xxl-job,做此纪录. 1.源码下载地址 GitHub:https: ...

  3. checkbox选中的行数

    $('[name=roomcheck]').each(function(){ if($(this).prop("checked")==true){ alert(this.id);/ ...

  4. poi操作excel之: 将NUMERIC转换成TEXT

    一.NUMERIC TO TEXT(生成excel)代码生成一个excel文件: public static void generateExcel() throws Exception { XSSFW ...

  5. 【luogu1325】雷达安装--贪心

    题目描述 描述: 假设海岸线是一条无限延伸的直线.它的一侧是陆地,另一侧是海洋.每一座小岛是在海面上的一个点.雷达必须安装在陆地上(包括海岸线),并且每个雷达都有相同的扫描范围d.你的任务是建立尽量少 ...

  6. python基础-跨域问题

    跨域 -- 浏览器的同源策略 阻止ajax请求 不阻止src请求 -- jsonp -- 我们利用src发送请求 -- core -- class MyCore(MiddlewareMixin): d ...

  7. JVM备忘点(1.8以前)

    1.内存结构 左边两个线程共享,右边三个线程私有. 方法区:.class文件的类信息.常量.static变量.即时编译器编译后的代码(动态代理).HotSpot将方法区称为永久代 堆:分为新生代和老年 ...

  8. chrome jssip

    WebRTC 实现了基于网页的视频会议,标准是WHATWG 协议,目的是通过浏览器提供简单的javascript就可以达到实时通讯(Real-Time Communications (RTC))能力 ...

  9. Maven版本问题导致的 unable to import maven project, see logs for details. 问题

    新电脑安装了基础环境后,jdk,maven也都安装好了,idea安装后,导入Java项目一切正常,但是idea中code一直导入import依赖包出现问题,错误提示:unable to import ...

  10. Linux 之Shell for循环

    @代表所有参数所以如果后面跟上echo $v你会发现他会一次显示user userdebug eng $poo -le ${#prodlist[@]} 这句话是说 $poo小于等于prodlist中的 ...