文章目录
- C语言495个问题
-
- 1、声明和初始化
-
- 1.1、如何觉得使用哪种整数类型
- 1.2、为什么不精确定义标准类型的大小
- 1.3、新的64位机器上的64位类型是什么样的
- [1.4、char *p1, p2;这个声明有什么问题,在使用p2的时候报错了](#1.4、char *p1, p2;这个声明有什么问题,在使用p2的时候报错了)
- 声明风格
// 个人能力提升笔记
C语言495个问题
1、声明和初始化
C语言的声明语法实际就是一种小的编程语言。一个声明包含如下几个部分(但并非都是必不可少的):存储类型、基本类型、类型限定词、最终声明符、初始化列表。每个声明符不仅声明一个新的标识符,同时也表示标识符是数组、指针、函数还是其他类型的任意组合。基本的思想就是让声明符模仿标识符的最终用法。
1.1、如何觉得使用哪种整数类型
如果可能达到很大的数值,那么就使用long类型。否则如果空间很重要,就使用short类型。除此之外可以使用int类型,如果定义明确的一出特征很重要而且负值无关紧要,或者希望在操作二进制位和字节时避免符号拓展的问题,那么可以使用unsigned类型。
在决定使用float类型还是double类型时也有类似的空间时间权衡。很多编译器在表到时求值的仍然会把所有的float类型转换为double类型进行运算。但是如果一个变量的地址确定为特定的类型时,则不需要管以上规则。
很多时候,大家可能会错误的认为C语言类型的大小都有精确的定义,实际上能够确保的只有如下几点:
- char类型可以存放小于128的值
- short int可以存放小于等于32767的值
- long int可以存放小于等于2147483647
- char至少有8位,short int和int至少有16位,long int至少有32位。
1.2、为什么不精确定义标准类型的大小
尽管和其他高级语言比起来,C语言可能相对低级,但是它还是认为对象的具体大小应该由具体的实现来决定,在C语言中唯一能够让你以二进制位的方式指定大小的地方就是结构中的位域。多数程序不需要精确控制这些大小,那些试图达到这一目的的程序如果不这样做可能会更好。
如果你真的需要精确的控制类型大小,还是有几点需要注意:
- 在某些机器上可能没有严格的对应关系
- 如果定义int16和int32只是为了表明至少有这么长,那么就没有什么实际意义,因为int和long已经分别能表示这些
- typedef定义对于字节顺序问题不能提供任何帮助
- 你其实也不需要自己定义类型,标准头文件<inttypes.h>中已经定义了int16_t,uint32_t等类型
1.3、新的64位机器上的64位类型是什么样的
C99已经标准定义了long long类型,其长度可以保证至少64位,这种类型在某些编译器上实现已经颇有时日了。其他的编译器也实现了类似__longlong的拓展。
1.4、char *p1, p2;这个声明有什么问题,在使用p2的时候报错了
这样的声明首先是没有任何的问题的,但是它可能不是你想要的。指针声明中的*号并不是基本类型的一部分,它只是包含被声明标识符的声明符的一部分。也就是说在C语言中,声明的语法并非是:
类型 标识符
而是:
基本类型 生成基本类型的东西
其中"声明基本类型的东西"就是声明符,或者说是一个简单的标识符,或者是如图 *p、a[10]或者f()这样的符号,表明被声明的变量是指向基本类型的指针、基本类型的数组或者返回基本类型的函数。
在问题的声明里,无论空白处暗示了什么,基本类型都是char,而第一个声明符是 *p1。因为符号中带有 * 号,所以这里的p1代表的是一个指向char类型的指针。而p2的声明符只有p2,因此p2就是普通的char型变量。这可能就不是你所希望的,在一行中声明两个指针的方式如下:
char *p1, *p2;