常用头: 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仍然读取了错误的字节