小拓展:C语言中int的正确使用姿势
上一节已经讲过,由于C语言中,整型的实际长度和范围不固定的问题,会导致C语言存跨平台移植的兼容问题,因此,C99标准中引入了stdint.h
头文件,有效的解决了该问题。
#include<stdio.h>
#include<stdint.h>
int main(void){
// 使用stdint.h中定义的类型表示整数
int8_t a = 0;
int16_t b = 0;
int32_t c = 0;
int64_t d = 0;
// 前面加u,表示unsigned,无符号
uint32_t e = 0;
printf("int8 size is %dn",sizeof(int8_t));
printf("int16 size is %dn",sizeof(int16_t));
printf("int32 size is %dn",sizeof(int32_t));
printf("int64 size is %dn",sizeof(int64_t));
printf("uint32 size is %dn",sizeof(uint32_t));
}
打印结果:
int8 size is 1
int16 size is 2
int32 size is 4
int64 size is 8
uint32 size is 4
int8_t
即表示8位整型,同理,int64_t
就是64位整型,类型定义明确清晰,且能兼容多种平台。以上代码,使用32位编译器,编译成32位系统下的程序后,运行得到的结果依然不变。这里一定会有朋友质疑,为什么32位的系统下,还能表示并使用int64
这种64位的整型?这当然就是stdint.h
库给我们带来的便利了,简单说一下原理,如果当前平台的是32位的,那么经过组合,我们可以使用两个32位拼起来,不就能表示64位了吗?同理,即使是8位的CPU,经过这种拼合思路,照样能表示64位!当然,聪明人一眼就看出了弊端,使用这种拼合的方式,数据需要经过组合转换,处理也更加复杂,同时还会带来性能的损失,但是C99标准库已经为我们处理好了一切,虽然付出了一定的性能损失,但是成功的实现了C语言整型的跨平台兼容,这样的损失是完全值得的。
由于stdint.h
头文件是C99标准引入的新特性,前面也说过微软的VC编译器不支持C99,那是不是VC就不能用了呢?好东西,当然人人眼馋,微软虽然表面上说不支持C99,但是这种有用的特性还是会引入,因此VS2010也引入了stdint.h
头文件,在VS2010及其以后的版本中,可以放心使用。但是要注意,只是引入了这个新特性,而不是支持C99。这里就要吐槽了,目前还在使用VC6.0教学的,还是上个世纪的人么?说和工具没关系的这些人,害人匪浅。
语法基础
表达式
与其他编程语言不同,C语言强调表达式而不是语句。表达式就如同计算值的公式,通过运算符把变量和常量组合起来。
算术运算符
主要包括加减乘除 +
、-
、*
、/
求余数,即取模运算 %
二元的算术运算还包括自增和自减 ++
、--
自增和自减运算符可以作为前缀或后缀使用,如下
int i = 0;
i++;
++i;
那么i++
和++i
的区别是什么呢? 关于这两者的区别,某些教材和网上一些资料是这样解释的,++
做前缀,是先让i
加1,做后缀则后加1,既在下一行代码前i
被加1。类似这种说法其实是不准确的,甚至是错误的,理解太过于表面,只是对现象的概括而已。这里咱们就一次把这个问题彻底搞明白,永不犯迷糊。
前面已经说了,C语言强调的是表达式而不是语句,那么表达式和语句有什么区别呢?我个人认为其中一个区别就是表达式整体一定有一个值,而语句可以没有返回值。有其他编程基础的朋友一定清楚所谓返回值的概念,那么就是说表达式一定有一个返回值,或者应该说是表达式整体的值。
i++
作为一个表达式,那么他的表达式的值是什么呢?其实我们可以用一个变量来保存表达式的值int r = i++;
int i = 0;
int r = i++;
printf("r=%dn",r);
可以看到,表达式的r
值为0。这个例子就很清楚了,所谓表达式的值,其实就是(i&#