《你必须知道的495个C语言问题》读书笔记之第15-20章:浮点数、风格、杂项
一、可变参数列表
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章:浮点数、风格、杂项的更多相关文章
- 你必须知道的495个c语言问题(笔记)
1.1我该如何决定使用哪种整数类型? 用到较大的数用long:空间很重要(例如有很大的数组或很多的结构)用short:此外用int. win32: int 32bit 4byte char 8b ...
- 你必须知道的495个C语言问题,学习体会一
C语言作为一门古老的语言,其灵活性和容易出错都让人 又爱又恨,书籍<你必须知道的495个C语言问题>,使用问答的形式,告诉读者 C语言使用的各个方面的知识,包括一些冷知识等.以下,我要摘录 ...
- C语言学习书籍推荐《你必须知道的495个C语言问题》
萨米特 (Steve summit) (作者), 孙云 (译者), 朱群英 (译者) 下载地址:点我 <你必须知道的495个C语言问题>以问答的形式组织内容,讨论了学习或使用C语言的过程中 ...
- 《你必须知道的495个C语言问题》知识笔记及补充
1. extern在函数声明中是什么意思? 它能够用作一种格式上的提示表明函数的定义可能在还有一个源文件里.但在 extern int f(); 和 int f(); 之间并没有实质的差别. 补充:e ...
- 你必须知道的495个C语言问题,学习体会四
本文,我们来学习下指针,这是个梦魇啊.无数次折磨着C语言学习者,无数次的内存泄露,无数次的访问失败,无数次的越界溢出, 这些错误造就的仅仅是一个 跟随者,真正的优秀者必须要正视语言的局限,同时在最大限 ...
- 你必须知道的495个C语言问题,学习体会三
本文是 本系列的第三篇,本文主要对C语言的表达式做个小结 先从两个坑爹的表达式说起:i++ 与++i 上大学的时候,学长告诉我,这两个表达式,意义是一样的,后来老师纠正说,还是有区别的,于是让我们记住 ...
- 你必须知道的495个C语言问题,学习体会二
这是本主题的第二篇文章,主要就结构体,枚举.联合体做一些解释 1.结构体 现代C语言编程 结构化的基石,diy时代的最好代言人,是面向对象编程中类的老祖宗. 我们很容易定义一个结构体,比如学生: st ...
- 《你必须知道的495个C语言问题》读书笔记之第11-14章:ANSI C标准、库函数、浮点数
一.ANSI C标准 1. ANSI向C语言预处理器引入了几项新的功能,包括“字符串化”操作符(#).“符号粘贴”操作符(##).#pragma指令. 2. Q:char a[3] = "a ...
- 《你必须知道的495个C语言问题》读书笔记之第8-10章:字符串、布尔类型和预处理器
一.字符和字符串 1. Q:为什么strcat(string, '!')不行? A:strcat()用于拼接字符串,所以应该写成strcat(string, "!")." ...
- 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针
1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...
随机推荐
- Vivado RAM使用
RAM使用的几点说明: 1,RAM的读写位宽可以不同,举例:写的位宽为8(1Byte),读的位宽为1(1bit),那么读的地址就变成了写地址的8倍,即位宽增加3bit.
- 【算法题目】Leetcode算法题思路:两数相加
在LeetCode上刷了一题比较基础的算法题,一开始也能解出来,不过在解题过程中用了比较多的if判断,看起来代码比较差,经过思考和改进把原来的算法优化了. 题目: 给出两个 非空 的链表用来表示两个非 ...
- Oracle 11.2 静默安装脚本
Oracle 11.2 静默安装脚本 cat db_init.sh.20190401 #!/bin/bash####安装Oracle所需依赖包function install_yum(){ yum ...
- chrome扩展开发实战入门之二-自动搜索
目标:产生随机数,用于百度搜索:像看电视一样观看搜索结果 参考上一篇,新建目录hellocrx,其中三个文件:manifest.json content_script.js 和jquery-3.4. ...
- Axios的params与data的
Axios发送请求时params和data的区别 https://www.cnblogs.com/cwzqianduan/p/8675356.html(copy 在使用axios时,注意到配置选项中 ...
- iptables防火墙--------基本概念
iptables按照规则进行处理,而iptables的规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址.目的地址.传输协议(TCP.UDP.ICMP)和服务类型(如HTTP.FTP和SMT ...
- pandas入门之Series
一.创建Series 参数 - Series (Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组.轴标签统称为索引. - data 参数 - index ...
- ie中打印的问题
一般正常的情况下使用window.print();各个浏览器都可以调用出打印功能来但是ie有个坑就是如果页面在iframe里的话打印出来就是错的页面所以在这里要这样写: var agent = nav ...
- idea中,springboot的热部署
1.开启idea的自动编译(静态) 具体步骤:打开顶部工具栏File | Settings | Build, Execution, Deployment | Compiler 然后勾选 Build p ...
- ZR#955 折纸
ZR#955 折纸 解法: 可以发现折纸之后被折到上面的部分实际上是没有用的,因为他和下面对应位置一定是一样的,而影响答案的只有每个位置的颜色和最底层的坐标范围.因此,我们只需要考虑最底层即可,即我们 ...