区块链网

区块链网

让建站和SEO变得简单

让不懂建站的用户快速建站,让会建站的提高建站效率!

应用案例 你的位置:区块链网 > 应用案例 > C讲话类型调遣(自动类型调遣+强制类型调遣)

C讲话类型调遣(自动类型调遣+强制类型调遣)

发布日期:2024-11-06 09:48    点击次数:142

#多的是你不知说念的事#

数据类型调遣即是将数据(变量、数值、抒发式的鸿沟等)从一种类型调遣为另一种类型。

想快速初学 C 讲话的小伙伴,这里我给全球推选一套之前看过的教程,讲话异常下里巴人,莫得那种“学院派”的滋味,常识点全面、详备,异常符合 0 基础、想快速初学编程的东说念主:

自动类型调遣

自动类型调遣即是编译器默然地、隐式地、悄悄地进行的数据类型调遣,这种调遣不需要步调员骚动,会自动发生。1) 将一种类型的数据赋值给另外一种类型的变量时就会发生自动类型调遣,举例:

float f = 100;

100 是 int 类型的数据,需要先调遣为 float 类型智商赋值给变量 f。再如:

int n = f;

f 是 float 类型的数据,需要先调遣为 int 类型智商赋值给变量 n。在赋值运算中,赋值号双方的数据类型不同期,需要把右边抒发式的类型调遣为左边变量的类型,这可能会导致数据失真,或者精度裁汰;是以说,自动类型调遣并不一定是安全的。关于不安全的类型调遣,编译器一般会给出警告。2) 在不同类型的搀杂运算中,编译器也会自动地调遣数据类型,将参与运算的所特地据先调遣为归拢种类型,然后再进行谋略。调遣的规矩如下:

调遣按数据长度增多的标的进行,以保证数值不失真,或者精度不裁汰。举例,int 和 long 参与运算时,先把 int 类型的数据转成 long 类型后再进走运算。通盘的浮点运算齐是以双精度进行的,即使运算中只消 float 类型,也要先调遣为 double 类型,智商进走运算。char 和 short 参与运算时,必须先调遣成 int 类型。

下图对这种调遣规矩进行了愈加形象地形色:

unsigned 也即 unsigned int,此时不错不详 int,只写 unsigned。

自动类型调遣示例:

#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;}

驱动鸿沟:

s1=78, s2=78.539749

在谋略抒发式r*r*PI时,r 和 PI 齐被调遣成 double 类型,抒发式的鸿沟亦然 double 类型。但由于 s1 为整型,是以赋值运算的鸿沟仍为整型,舍去了少许部分,导致数据失真。

强制类型调遣

自动类型调遣是编译器把柄代码的险峻文环境自行判断的鸿沟,巧合分并不是那么“智能”,不可闲静通盘的需求。若是需要,步调员也不错我方在代码中明确地冷漠要进行类型调遣,这称为强制类型调遣。自动类型调遣是编译器默然地、隐式地进行的一种类型调遣,不需要在代码中体现出来;强制类型调遣是步调员明确冷漠的、需要通过特定格式的代码来指明的一种类型调遣。换句话说,自动类型调遣不需要步调员骚动,强制类型调遣必须有步调员骚动。强制类型调遣的格式为:

(type_name) expression

type_name为新类型称号,expression为抒发式。举例:

(float) a; //将变量 a 调遣为 float 类型(int)(x+y); //把抒发式 x+y 的鸿沟调遣为 int 整型(float) 100; //将数值 100(默许为int类型)调遣为 float 类型

底下是一个需要强制类型调遣的经典例子:

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

驱动鸿沟:Average is 14.714286!sum 和 count 齐是 int 类型,若是不进行骚动,那么sum / count的运算鸿沟亦然 int 类型,少许部分将被丢弃;固然是 average 是 double 类型,不错接受少许部分,然则心多余力不及,少许部分提前就被“阉割”了,它只可接受到整数部分,这就导致除法运算的鸿沟严重失真。既然 average 是 double 类型,为何不充分运用,尽量晋升运算鸿沟的精度呢?为了达到这个方针,咱们只消将 sum 或者 count 其中之一瞥换为 double 类型即可。上头的代码中,咱们将 sum 强制调遣为 double 类型,这么sum / count的鸿沟也将形成 double 类型,就不错保留少许部分了,average 接受到的值也会愈加精准。在这段代码中,有两点需要阻扰:

关于除法运算,若是除数和被除数齐是整数,那么运算鸿沟亦然整数,少许部分将被成功丢弃;若是除数和被除数其中有一个是少许,那么运算鸿沟亦然少许。这一丝已在《C讲话加减乘除运算》中进行了详备发挥。( )的优先级高于/,关于抒发式(double) sum / count,会先施行(double) sum,将 sum 调遣为 double 类型,然后再进行除法运算,这么运算鸿沟亦然 double 类型,粗略保留少许部分。阻扰不要写稿(double) (sum / count),这么写运算鸿沟将是 3.000000,仍然不可保留少许部分。

类型调遣仅仅临时性的

无论是自动类型调遣还是强制类型调遣,齐仅仅为了本次运算而进行的临时性调遣,调遣的鸿沟也会保存到临时的内存空间,不会编削数据正本的类型或者值。请看底下的例子:

#include <stdio.h>int main(){double total = 400.8; //总价int count = 5; //数量double unit; //单价int total_int = (int)total;unit = total / count;printf("total=%lf, total_int=%d, unit=%lf\n", total, total_int, unit);return 0;}

驱动鸿沟:total=400.800000, total_int=400, unit=80.160000阻扰看第 6 行代码,total 变量被调遣成了 int 类型才赋值给 total_int 变量,而这种调遣并未影响 total 变量自己的类型和值。若是 total 的值变了,那么 total 的输出鸿沟将变为 400.000000;若是 total 的类型变了,那么 unit 的输出鸿沟将变为 80.000000。

自动类型调遣 VS 强制类型调遣

在C讲话中,有些类型既不错自动调遣,也不错强制调遣,举例 int 到 double,float 到 int 等;而有些类型只可强制调遣,不可自动调遣,举例以后将要学到的 void * 到 int *,int 到 char * 等。不错自动调遣的类型一定粗略强制调遣,然则,需要强制调遣的类型不一定粗略自动调遣。现时咱们学到的数据类型,既不错自动调遣,又不错强制调遣,以后咱们还会学到一些只可强制调遣而不可自动调遣的类型。不错自动进行的类型调遣一般风险较低,不会对步调带来严重的成果,举例,int 到 double 莫得什么纰谬,float 到 int 酌定是数值失真。只可强制进行的类型调遣一般风险较高,或者举止匪夷所念念,举例,char * 到 int * 即是很奇怪的一种调遣,这会导致获得的值也很奇怪,再如,int 到 char * 即是风险极高的一种调遣,一般会导致步调崩溃。使用强制类型调遣时,步调员我方要坚韧到潜在的风险。



Powered by 区块链网 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群 © 2013-2024