本篇文章整理了 3 道 Linux 下 C 语言的经典题目, 并附上了详细的分析希望以此大家可以更好的理解 C 语言, 欢迎大家讨论指正
1 如果在 Linux 下使用 GCC 编译器执行下列程序, 输出结果是什么?
小编推荐一个学 C 语言 / C++ 的学习裙 二六三, 六八八, 二七六 , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
输出结果: 4321
程序分析:
程序先输出 43, 然后紧接着输出 printf 函数的返回值 printf 函数的返回值是输出字符的个数所以在执行完最里面的 printf("%d",i)输出 43 之后, 接着输出 printf("%d",43)的返回值即 2, 最后再打印 printf("%d",2)的返回值即 1 所以最后的输出结果是 4321
2 如果在 Linux 下使用 GCC 编译器执行下列程序, 输出结果是什么?
输出结果: 1020
程序分析:
当 i = FFFFFF00H 的时候, 才有''出现 (因为 char 类型只占一个字节, 当 i = FFFFFF00H 的时候, 最后一个字节就是 00H, 也即''),C 风格字符串读到''就终止了 FFFFFF00H 是 -256, 就是 i 的值为 255 时 a[i] = FFFFFF00H, 因此最终输出结果是 255*4=1020(a[0] ~ a[254] 总共 255 个整型)
3 如果在 Linux 下使用 GCC 编译器执行下列程序, 输出结果是什么?
小编推荐一个学 C 语言 / C++ 的学习裙 二六三, 六八八, 二七六 , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
输出结果:
十进制 c=-128
十六进制 c=0XFFFFFF80
程序分析:
128 的十六进制是 0x80, 也就是 2^7, 二进制看起来像这样: 1000 0000 , 赋值给有符号数 char c, 其二进制不变
但是小于 sizeof(int)的整数在使用时其实都是扩展到 sizeof(int)再计算的, 对于有符号数扩宽填充符号位, 这里 char c=128 的符号位是 1, 所以就是扩充了 1111 1111 1111 1111 1111 1111 1000 0000, 这样, 打印 %x 时候, 就是你看到的结果了
这个扩宽是很正常的, 并不会影响一个数值本身, 只是存储的字节变宽了而已
符号位为 1 的二进制转十进制负数
除去符号位减 1;
除去符号位, 按位取反; 结果就是负数的原码;
原码转成相应的十进制
因为符号位为 1, 所以被当做负数, 而负数是以补码形式存在的,
所以其反码是 1111 1111 1111 1111 1111 1111 1000 0000 - 1=1111 1111 1111 1111 1111 1111 0111 1111
原码是 1000 0000 0000 0000 0000 0000 1000 0000 转化为十进制是 - 128
最后, 上述 3 道 Linux 下 C 语言的经典题目只为更好的理解 C 语言相关知识, 当然在实际项目中不会出现类似代码, 欢迎大家探讨指正
来源: http://www.jianshu.com/p/d595ece47ec8