C 语言 数据类型、运算符等基础
C 语言数据类型
数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
变量特点:
- 变量在编译时为其分配相应的内存空间;
- 可以通过其名字和地址访问相应内存;
声明和定义的区别:
- 声明变量不需要建立存储空间,如:
extern int a
; (使用extern
关键字) - 定义变量需要建立存储空间,如:
int b
; - 从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义:
①int b
它既是声明,同时又是定义;
②对于extern int b
来讲它只是声明不是定义; - 一般的情况下,把建立存储空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。
sizeof 关键字
sizeof
不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节;sizeof
的返回值为size_t
;size_t
类型在 32 位操作系统下是unsigned int
,是一个无符号的整数;
#include <stdio.h>
int main(int argc, char const *argv[])
{
//数据类型的作用: 告诉编译器,分配此类型的变量需要多大的空间
printf("sizeof(char) = %u\n",sizeof(char));
int a;
printf("sizeof(a) = %d\n",sizeof(a));
size_t len = sizeof(long);
printf("sizeof(long) = %u\n",len);
return 0;
}
输出:
sizeof(char) = 1
sizeof(a) = 4
sizeof(long) = 8
char 数据类型-char 的本质就是一个 1 字节大小的整型
- 内存中没有字符,只有数字;
- 一个数字,对应一个字符,这种规则就是
ascii
; - 使用字符或数字给字符变量赋值是等价的;
- 字符类型本质就是 1 个字节大小的整形;
- 字符变量实际上并不是把该字符本身放到变量的内存单元中去,而是将该字符对应的 ASCII 编码放到变量的存储单元中。
测试:
#include <stdio.h>
int main(int argc, char const *argv[])
{
char ch = 'a';
printf("ch[c] = %c, ch[d] = %d\n",ch, ch);
char ch2 = 97;
printf("ch2[c] = %c\n", ch2);
printf("ch2 - 32 = %c\n",ch2 - 32);
return 0;
}
输出:
ch[c] = a, ch[d] = 97
ch2[c] = a
ch2 - 32 = A
以及注意转义字符:
转义字符简单测试:
#include <stdio.h>
int main(int argc, char const *argv[])
{
char ch = '\r';
printf("abcdddd%cefg\n",ch);
ch = '\b';
printf("12%c345\n",ch);
ch = ' ';
printf("%d\n",ch); // 打印' '的对应数字
// 8 进制转义字符
printf("%d\n", '\123'); //8 进制 123 --> 对应 10 进制 83
printf("%d\n", '\x23'); //16 进制 23 --> 对应 10 进制 35
// '\0'和 0 等价
printf("%d,%d\n",'\0',0);
return 0;
}
输出:
efgdddd
1345
32
83
35
0,0
浮点数不准确、类型限定符
浮点数不准确:
#include <stdio.h>
int main(int argc, char const *argv[])
{
float a = 100.9;
printf("a = %f\n",a);
return 0;
}
输出:
a = 100.900002
原因还是计算机按照 二进制
存储。
- 类型限定符:
字符的输入问题
#include <stdio.h>
int main(int argc, char const *argv[])
{
char ch1;
printf("请输入字符:");
scanf("%c",&ch1);
printf("ch1 = %c\n",ch1);
char ch2;
printf("请输入字符:");
scanf("%c",&ch2);
printf("ch2 = %c\n",ch2);
//输出 ch2 的 ascii 码
printf("ch2[d] = %d\n",ch2);
return 0;
}
输入输出演示:
这个程序要特别注意:
- 当我们输入完一个字符时,按下回车,会直接结束程序;
- 因为第二个字符在按下回车的时候已经输入完成了,也就是
ch2 = '\n'
;而'\n'
的ascii
码为 10;
处理上面的问题,可以使用另一个字符变量过滤掉 \n
,也可以使用 getchar()
来过滤一个字符:
#include <stdio.h>
int main(int argc, char const *argv[])
{
char ch1;
printf("请输入字符:");
scanf("%c",&ch1);
printf("ch1 = %c\n",ch1);
//为了处理上面的问题,可以自己用 scanf 处理这个回车
char tmp;
//scanf("%c",&tmp); //或者使用下面的方法输入一个字符
// tmp = getchar(); //或者也可以直接调用 getchar() 即可
getchar();
char ch2;
printf("请输入字符:");
scanf("%c",&ch2);
printf("ch2 = %c\n",ch2);
//输出 ch2 的 ascii 码
printf("ch2[d] = %d\n",ch2);
return 0;
}
运算符以及优先级
运算符优先级:
另外,注意 逻辑判断中的 短路原则。
类型转换
- 隐式转换: 编译器内部自动转换;
- 强制类型转换:把表达式的运算结果强制转换成所需的数据类型。
- 浮点型打印说明: 不要以为指定了打印的类型就会自动转换,必须要强制转换;
- 转换原则: 数据类型小的往大的转换;
#include <stdio.h>
int main(int argc, char const *argv[])
{
printf("------------隐式转换-----------\n");
//隐式转换
double a;
int b = 10;
//编译器内部自动转换,在第 10 行自动转换,其他地方 b 还是 int
a = b;
printf("a = %lf\n",a);
printf("------------强制类型转换-----------\n");
//强制类型转换
double c = (double)1/2; //强制将 1 转换成 double
printf("c = %lf\n",c);
printf("sizeof(int) = %u\n",(unsigned int)sizeof(int));
printf("------------浮点型打印说明-----------\n");
//浮点型打印说明
int d = 11;
printf("d[wrong] = %lf\n",d); //以为指定了%lf 就会转换成浮点数,其实是错的
printf("d[right] = %lf\n",(double)d); // 正确的打印是要强制类型转换的
double e = 88.14;
printf("e[wrong] = %d\n",e);
printf("e[right] = %d\n",int(e));
printf("-------------转换原则----------\n");
//转换原则: 数据类型 小的往大的 转换
int g = 129;
char h = 111;
//g = (int)h; // 这个是可以转换的
//printf("g = %d\n",g);
h = (char)g; //这个转换是出错的,h 会变成一个负数
printf("h = %d\n",h);
return 0;
}
输出:
------------隐式转换-----------
a = 10.000000
------------强制类型转换-----------
c = 0.500000
sizeof(int) = 4
------------浮点型打印说明-----------
d[wrong] = 0.000000
d[right] = 11.000000
e[wrong] = 1519177328
e[right] = 88
-------------转换原则----------
h = -127
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: C 语言 进制,原、反、补码
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论