C 语言 数据类型、运算符等基础

发布于 2024-06-13 11:39:09 字数 6434 浏览 15 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

流年已逝

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文