龙空技术网

4.C语言-基本数据类型2

数字双碳王亮 109

前言:

此时姐妹们对“c语言统计出现个数”大概比较关切,小伙伴们都需要学习一些“c语言统计出现个数”的相关内容。那么小编也在网上搜集了一些对于“c语言统计出现个数””的相关内容,希望大家能喜欢,你们一起来了解一下吧!

1. 类型转换

自动转换

自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型转换为左边变量的类型,这可能会导致数据失真,或者精度降低;所以说,自动类型转换并不一定是安全的。对于不安全的类型转换,编译器一般会给出警告。

#include<stdio.h>void main() {  float f = 100.34f;  int n = f;  printf("%d", n);}

转换的规则如下:

转换按数据长度增加的方向进行,以保证数值不失真,或者精度不降低。例如,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进行运算。所有的浮点运算都是以双精度进行的,即使运算中只有 float 类型,也要先转换为 double 类型,才能进行运算。char 和 short 参与运算时,必须先转换成 int 类型。

#include<stdio.h>int main() {    float PI = 3.14159;    int s1, r = 5;    double s2;    s1 = r * r * PI;    s2 = r * r * PI;    printf("s1=%d, s2=%f\n", s1, s2);    return 0;}

一个变态的自动转换

#include <stdio.h>int main() {    float d= 10 + 'a' + 1.5 - 8765.1234 * 'b';    printf("total=%f", d);    return 0;}

强制类型转换

在代码中明确地提出要进行类型转换,这称为强制类型转换。

强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。

强制类型转换的格式为:

(type_name) expression

#include <stdio.h>int main() {    int sum = 103;  //总数    int count = 7;  //数目    double average;  //平均数    average = (double)sum / count;    printf("平均数:%f!\n", average);    return 0;}

sum 和 count 都是 int 类型,如果不进行干预,那么sum / count的运算结果也是 int 类型,小数部分将被丢弃;虽然是 average 是 double 类型,可以接收小数部分,但是心有余力不足,小数部分提前就被“阉割”了,它只能接收到整数部分,这就导致除法运算的结果严重失真。

类型转换只是临时性的

无论是自动类型转换还是强制类型转换,都只是为了本次运算而进行的临时性转换,转换的结果也会保存到临时的内存空间,不会改变数据本来的类型或者值。

#include <stdio.h>int main() {    double total = 200.48;    int count = 5;    double unit;    int int_total = (int)total;    unit = total / count;    printf("total=%f,int_total=%d,unit=%f", total, int_total, unit);    return 0;}

这里(int)total并不会改变total的值。

2. 跨平台移植的整数

不同平台,不同编译器,整数的大小不一样

int 16位系统下2个字节,32位下4个字节

在liunx 64位下是8个字节,对于Windows 32,64都是4个字节

#include<stdio.h>void main() {    printf("%d", sizeof(long));//输出4}

在debain下编译输出

引入stdint.h头文件解决此问题,需支持C99的编译器

#include<stdio.h>#include<stdint.h>void main() {    printf("%d", sizeof(int64_t));}
3. bool类型

在 C 语言标准(C89)没有定义布尔类型,所以 C 语言判断真假时以 0 为假,非 0 为真。所以我们通常使用逻辑变量的做法:

用int来做标记

#include<stdio.h>void main() {  int flag;  flag = 0;  flag = 1;}

宏定义布尔类型

//宏定义布尔类型#define BOOL int#define TRUE 1#define FALSE 0#include<stdio.h>void main() {  BOOL flag = TRUE;  printf("%d", flag);  flag = FALSE;  printf("%d", flag);}

在最新的 C 语言标准(C99)解决了布尔类型的问题。C99 提供了 _Bool 型,所以布尔类型可以声明为 _Bool flag。

_Bool 依然仍是整数类型,但与一般整型不同的是,_Bool 变量只能赋值为 0 或 1,非 0 的值都会被存储为 1。

#include<stdio.h>void main() {  _Bool b1 = 1;  _Bool b2 = 2;  _Bool b3 = 0;  _Bool b4 = -5;  printf("b1=%d,b2=%d,b3=%d,b4=%d", b1,b2,b3,b4);}

在C++中,通过bool来定义布尔变量,通过true和false对布尔变量进行赋值。C99为了让我们能够写出与C++兼容的代码,添加了一个头文件<stdbool.h>

#include<stdio.h>#include<stdbool.h>void main() {  bool b1 = true;  bool b2 = false;  bool b3 = 2 == 2;  printf("%d,%d,%d", b1, b2,b3);}
4. 基础数据类型进阶

浮点数数据丢失

void main() {  float f1 = 3.14159264;  printf("%f", f1);//小数点后6位,6位内正确,超出6位,不可预知  float f2 = 3.14159263;  if (f2 == f1) {    printf("等于了!");  }}

double

void main() {  double d1 = 1.123456789123456789123456789;  printf("%f,%.20f", d1, d1);//1.123457,1.12345678912345681155  //小数点后15位,15位内正确,超出15位,不可预知}
#define _CRT_SECURE_NO_WARNINGS //关闭安全检查#include<stdio.h>#include<float.h>void main() {  float f;  double d;  long double ld;  printf("%d,%d,%d\n", sizeof(f), sizeof(d), sizeof(ld));  //分别输入  scanf("%f", &f);  scanf("%lf", &d);  scanf("%Lf", &ld);  printf("%f,%lf,%Lf\n", f, d, ld);  printf("%f,$f\n", FLT_MAX, FLT_MIN);  //在windows下max是一样的  printf("%lf,%lf\n", DBL_MAX, DBL_MIN);  printf("%Lf,%Lf", LDBL_MAX, LDBL_MIN);}
#include<stdio.h>#include<float.h>void main() {  double d1 = 1.11111111111111111111111113;  double d2 = 1.11111111111111111111111112;  if (d1 == d2) {    printf("相等!");  }  double d3 = 1.11111111111111011101111113;  double d4 = 1.11111111111111011111111112;  if (d3 == d4) {    printf("相等!");  }}

看一下float在内存中是怎么保存的

查看32位浮点

一个float在内存中占4个字节,32个bit

5. long double与long long

#include<stdio.h> void main() {  int num = 17600807885;  printf("%d\n", num);//这个手机号存不对了  long long mobile = 17600807885;  printf("%lld\n", mobile);//需要lld  printf("\n%d", sizeof("17600807885"));}
#include<stdio.h>#include<limits.h> void main() {  printf("%lld,%lld\n", LLONG_MAX, LLONG_MIN);  printf("%llu", ULLONG_MAX);//无符号}
6. 自动变量

函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量)都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间,这类局部变量称为自动变量。

#include<stdio.h>#include<stdlib.h>void main() {    int x = 10;    auto int y = 9;    auto int z = x + y;    printf("%p,%d", &z, z);}
void main() {  int x = 10;  auto y = 9;  auto z = x + y;  printf("%p,%d", &z, z);}
7. 基本输入输出

putchar函数是字符输出函数,其功能是在终端(显示器)输出单个字符。其函数原型为:

#include<stdio.h>#include<stdlib.h>void main() {    putchar('A');    putchar('av1');    //输出A1}

getchar函数的功能是接收用户从键盘上输入的一个字符。其一般调用形式为:

#include<stdio.h>#include<stdlib.h>void main() {  char c;  /*定义字符变量c*/  c = getchar();  /*将读取的字符赋值给字符变量c*/  printf("%c", c);}

scanf函数称为格式输入函数,即按照格式字符串的格式,从键盘上把数据输入到指定的变量之中。

转换说明符

%c

把输入解释成一个字符

%d

把输入解释成一个有符号十进制整数

%e,%f,%g,%a

把输入解释成一个浮点数(%a是C99的标准)

%E,%F,%G,%A

把输入解释成一个浮点数(%A是C99的标准)

%i

把输入解释成一个有符号十进制整数

%o

把输入解释成一个有符号的八进制整数

%p

把输入解释成一个指针(一个地址)

%s

把输入解释成一个字符串:输入的内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符

%u

把输入解释成一个无符号十进制整数

%x,%X

把输入解释称一个有符号十六进制整数

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void main() {  int num;  printf("请输入一个数字:\n");  scanf("%d", &num);//用地址接收  printf("您输入的数字是:%d", num);}
8. 两个例子

用户输入任务一数字,输出其对应的十进制,八进制,十六进制

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void main() {  int num;  printf("请输入一个数字:\n");  scanf("%d", &num);//用地址接收  printf("您输入的数字是:%d,0%o,0x%x", num,num,num);}

已知半径r,求一个圆的面积是多大。

#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>#define PI 3.1415926void main() {  float num;  printf("请输入一个半径:\n");  scanf("%f", &num);//用地址接收  printf("面积是:%5f",num*num*PI);}

标签: #c语言统计出现个数