C-C Primer Plus阅读笔记

常用头: stdio.h string.h inttypes.h limits.h float.h

1.打印short、long、long long和unsigned

#include <stdio.h>

int main(void) {
        unsigned int un = 3000000000;
        short end = 200;
        long big = 65537;
        long long verybig = 12345678908642;
        printf("un = %u and not %d\n", un, un); //u=ud
        printf("end = %hd and %d\n", end, end);
        printf("big = %ld and not %hd\n", big, big);
        printf("verybig=%lld and not %ld\n", verybig, verybig);
        return 0;
}

  结论:即使是变量本身是无符号类型, 打印的时候也需要加上u, 否则按有符号类型打印; 如果用短类型去打印长类型, 则会被截取最后N位

2.八进制或十六进制表示一个字符

char c = '\0101';
char ch = '\x41';

  PS:为什么使用'\0101'而不是0101表示一个字符, 因为'\0101'更能清晰的表达一个字符的意图, 其次'\0101'这样的转义序列可以嵌入到C字符串中, 如"Hello!\0101\n"

3.缓冲区满、遇到换行符及需要输入的时候会将缓冲区内容输出到屏幕

4.浮点型常量默认是double(可以加后缀f为float型存储), 整型常量默认以int型存储(可以加后缀l把小整数变为long型存储), 如果int不能表示则用long, 如果long不能表示则用unsigned long, 如果仍然不够则使用long long或unsigned long long来表示

5.类型转换http://www.cnblogs.com/JohnABC/p/4466113.html

6.scanf 在读取字符串时遇到空格即停止

7.printf("*%5.3d*", 2); 结果为 *  002*

8.

#include <stdio.h>

int main() {
        float n1 = 3.0;
        float n2 = 3.0;
        long n3 = 2000000000;
        long n4 = 1234567890;
        printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);
        return 0;
}

  输出0 1074266112 0 1074266112

9.printf 工作原理

  如8中的例子

printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);

  该调用告诉计算机把变量n1, n2, n3, n4的值传递给计算机, 计算机把他们放置到堆栈的一块内存中, 计算机根据变量的类型而非转换说明符把这些值放到堆栈中, 所以n1在堆栈中占用8个字节(float被转换成double), 同样, n2占用8个字节, n3和n4分别占用4个字节, 然后控制转移到printf函数, 该函数从堆栈把值读出来, 但是在读取时, 它根据转换说明符去读取, %ld说明符指出, printf应该读取4个字节, 索引printf在堆栈中读取前4个字节作为它的第一个值, 这就是n1的前半部分, 它被解释成一个长整数, 下一个%ld说明符再读取4个字节, 这就是n1的后半部分, 它被解释成第二个长整数, 同样%ld的第三个和第四个实例使得n2的前半部分和后半部分被读出, 并被解释成两个长整数, 所以虽然n3和n4的说明符都正确, 但是printf仍然读取了错误的字节

 

你可能感兴趣的:(Prim)