《你必须知道的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 ...
随机推荐
- P2993 [FJOI2014]最短路径树问题
思路:最短路+点分治 提交:2次 错因:更新桶的时候没有重置,而直接加上了. 题解: 对于构建最短路树,我们可以先跑最短路,然后dfs一遍连边. 然后就是点分治了,还是一些桶,存点数为\(x\)的最长 ...
- IDEA更改Maven项目的webapp的版本号
使用Maven新建的web项目后默认的web.xml为2.3的,以前每次都是从其他文件中拷贝过来的2.5或者3.1的进行替换,怎样指定默认创建web项目的版本? 1.使用IDEA的Help文档具体的过 ...
- Echarts-树状图(源码 含flare.json)
刚刚发现官网实例里边的数据其实在:https://www.echartsjs.com/data/asset/data/flare.json 源码: html: <!DOCTYPE html> ...
- Java并发指南5:JMM中的final关键字解析
本文转载自互联网,侵删 与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的 ...
- Colab 实用教程
Google Colab 是什么? Google Colab 是一个免费的云服务,现在它还支持免费的 GPU! 你可以: 提高你的 Python 语言的编码技能. 使用 Keras.TensorFlo ...
- DELPHI安卓动态权限申请
DELPHI安卓动态权限申请 安卓8.0以前的版本,只需要给静态权限就可以了,但安卓8.0及以后的版本,还需要运行期用代码动态申请权限. 下面以<蓝牙权限>为例,其他权限类似. Delph ...
- 验证HashSet和HashMap不是线程安全
JAVA集合类: java.util包下的HashSet和HashMap类不是线程安全的, java.util.concurrent包下的ConcurrentHashMap类是线程安全的. 写2个测试 ...
- LC 984. String Without AAA or BBB
Given two integers A and B, return any string S such that: S has length A + B and contains exactly A ...
- opencv C++ mask_rcnn
#include <fstream> #include <sstream> #include <iostream> #include <string.h> ...
- mfc判断当前程序是否正在运行
HANDLE hMutex = CreateMutex(NULL,TRUE,_T("appName")); if(hMutex) { if(ERROR_ALREADY_EXISTS ...