《你必须知道的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 = 1;
if (*(char *)&x == 1)
    printf("little-endian
");
else
    printf("big-endian
");

// method 2: use union
union U {
    int i;
    char c[sizeof(int)];
};
U u;
u.i = 1;
if (x.c[0] == 1)
    printf("little-endian
");
else
    printf("big-endian
");
原文地址:https://www.cnblogs.com/wuhualong/p/ReadingNote_C_Programming_FAQs_Chap15-20.html