zoukankan      html  css  js  c++  java
  • 《你必须知道的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
    ");
  • 相关阅读:
    JAVA学习笔记(十二)
    JAVA学习笔记(十)
    JAVA学习笔记(九)
    JAVA学习笔记(八)
    JAVA学习笔记(七)
    JAVA学习笔记(六)
    JAVA学习笔记(五)
    20180313 mysql
    20180306 事件监听的方法 添加事件监听和取消事件监听 轮播图
    20180302DOM通过节点关系获取元素 表单元素 下拉列表 网页换肤 操作表格 问候
  • 原文地址:https://www.cnblogs.com/wuhualong/p/ReadingNote_C_Programming_FAQs_Chap15-20.html
Copyright © 2011-2022 走看看