① Linux C - C基础篇(一)
1) 最高位是符号位,0表示正数,1表示负数。
2) 如果是正数,正常表示(即原码),如果是负数,先求反码,再求补码(补码为反码加1)即为他的二进制表示。例如char型的1,用二进制表示为00000001;char型的-1用二进制表示为11111111。
常量,就是在程序运行过程中值无法被改变;变量,就是在程序运行过程中内部存储的值随时可以被改变。变量是“可读、可写”,而常量,是“只读”的。
整形常量:12、浮点型常量:12.35、实数型常量:1.3e-5、字符型常量:'a'、字符串型常量:"abc"、标识符常量:#define LEN 10。
变量一般存放在内存中:栈区, 静态数据区,全局变量区, 堆区。函数中定义的变量,如果不加特殊修饰,都是保存在栈区,函数调用结束,栈空间被自动释放。
定义变量:
<存储类型> <数据类型> <变量名>
static/auto/... int/char a
例如:static int a;char c;
存储类型:
自动类型转换
将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型转换,例如:float a = 10;10是int类型的数据,需要先转换成float类型然后再赋值给变量a。
在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:
强制类型转换
自动类型转换是编译器根据代码自己判断的,有时候我们需要手动的进行数据类型转换,称之为强制类型转换,例如:
(int)(a+b); //将a + b 求得结果的数据类型强制转换为int型。
运算符的优先级
特殊运算符>单目运算符>双目运算符>三目运算>赋值运算>逗号运算
② Linux GNU C 和 ANSI C 的区别
Linux环境下的C编程主要依赖GNU C编译器,它在标准C的基础上进行了一系列扩展,增强了C语言的功能。以下是GNU C与ANSI C的一些关键区别:
1.
零长度和变量长度数组:GNU C允许使用零长度数组,这对于处理变长数据结构非常有用。例如,你可以定义一个不分配内存的数组,仅用于指明数据结构的结构。
2.
Case范围:GNU C支持case x…y的语法,扩展了标准C的case语句范围,使得程序更加灵活。
3.
语句表达式:GNU C中的括号复合语句被看作表达式,这使得在更广泛的上下文中使用复杂的控制结构成为可能。
4.
Typeof关键字:GNU C允许使用typeof获取变量类型,这在定义宏时很有用,避免了传递类型作为参数的繁琐。
5.
可变参数宏:GNU C支持可变参数宏,使得函数参数的数量可以根据需要动态调整,如printf函数在宏中的应用。
6.
标号元素:GNU C允许数组和结构体的初始化值按任意顺序,提供了更大的灵活性。
7.
当前函数名:GNU C提供了__FUNCTION__和__PRETTY_FUNCTION__来获取当前函数名,C99的__func__更推荐使用。
8.
特殊属性声明:GNU C支持如noreturn、format等属性,用于优化代码和自定义检查方法。
9.
内建函数:GNU C提供了大量内建函数,包括对标准库函数的优化版本和一些特定用途的函数,如返回地址和常数检测。
10.
兼容性与扩展:如果使用“-ansi–pedantic”选项,gcc会限制使用GNU扩展,如上述的某些特性可能不再可用。
以上是GNU C相对于标准C的主要扩展点,这些特性在Linux内核编程中发挥着重要作用。