第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

C 語(yǔ)言入門教程

C 語(yǔ)言基礎(chǔ)教程
01 C 語(yǔ)言簡(jiǎn)介 02 C 語(yǔ)言的程序結(jié)構(gòu) 03 C 語(yǔ)言的編譯 04 C 語(yǔ)言的標(biāo)準(zhǔn) 05 C 語(yǔ)言中的注釋 06 C 語(yǔ)言中的變量 07 C 語(yǔ)言中的變量類型 08 C 語(yǔ)言的常量 09 C 語(yǔ)言的輸入與輸出 10 C 語(yǔ)言中的 printf() 格式輸出 11 C 語(yǔ)言中的類型轉(zhuǎn)換 12 C 語(yǔ)言中的運(yùn)算符 13 C 語(yǔ)言中的算數(shù)運(yùn)算符 14 C 語(yǔ)言中的位運(yùn)算符 15 C 語(yǔ)言中的邏輯運(yùn)算符 16 C 語(yǔ)言中的三目運(yùn)算符 17 C 語(yǔ)言中的分支結(jié)構(gòu) 18 C 語(yǔ)言中的多重分支 19 C 語(yǔ)言中的分支嵌套結(jié)構(gòu) 20 C 語(yǔ)言中的循環(huán)結(jié)構(gòu) 21 C 語(yǔ)言中的 while 循環(huán) 22 C 語(yǔ)言中的 do-While 循環(huán) 23 C 語(yǔ)言中的 for 循環(huán) 24 C 語(yǔ)言中的多重循環(huán)嵌套 25 循環(huán)實(shí)戰(zhàn),打印九九乘法表 26 C 語(yǔ)言中的break和continue 27 C 語(yǔ)言中的 if 語(yǔ)句 28 C 語(yǔ)言中的 switch/case 語(yǔ)句 29 C 語(yǔ)言中的函數(shù) 30 C 語(yǔ)言函數(shù)的定義和聲明 31 C 語(yǔ)言中函數(shù)的參數(shù)傳入類型 32 C 語(yǔ)言中的 main() 函數(shù)參數(shù) 33 make 工具 makefile 34 C 語(yǔ)言中的數(shù)組 35 C 語(yǔ)言中的多維數(shù)組 36 數(shù)組的練習(xí) 37 C 語(yǔ)言中的字符串 38 C 語(yǔ)言中的字符串函數(shù) 39 C 語(yǔ)言字符串練習(xí) 40 C 語(yǔ)言中的指針 41 C 語(yǔ)言中的 struct 42 C 語(yǔ)言中的 union 43 C 語(yǔ)言中的 maclloc free() 44 C 語(yǔ)言中的 enum 45 整體練習(xí)-學(xué)生管理系統(tǒng)

C 語(yǔ)言中的類型轉(zhuǎn)換

我們?cè)谇懊鎸W(xué)習(xí)了 C 語(yǔ)言的數(shù)據(jù)類型,那么變量在參與運(yùn)算的時(shí)候類型是始終如一不變的嗎?

帶著這個(gè)疑問(wèn),我們可以先看一個(gè)例子:

#include <stdio.h>

#define typename(x) _Generic((x),        /* Get the name of a type */             \
                                                                                  \
        _Bool: "_Bool",                  unsigned char: "unsigned char",          \
         char: "char",                     signed char: "signed char",            \
    short int: "short int",         unsigned short int: "unsigned short int",     \
          int: "int",                     unsigned int: "unsigned int",           \
     long int: "long int",           unsigned long int: "unsigned long int",      \
long long int: "long long int", unsigned long long int: "unsigned long long int", \
        float: "float",                         double: "double",                 \
  long double: "long double",                   char *: "pointer to char",        \
       void *: "pointer to void",                int *: "pointer to int",         \
      default: "other")

int main()
{
    int a=1,b=2;
    float c=3.14159,d=0;
    printf("a type: %s, b type: %s, c type: %s, d type: %s\n",typename(a),typename(b),typename(c),typename(d));
    a=b+c;
    printf("a=b+c, a=%d\n",a);
    printf("type (b+c): %s\n",typename(b+c));
    d=b+c;
    printf("d=b+c, d=%f\n",d);
    return 0;
}

經(jīng)過(guò)編譯運(yùn)行后得到如下的結(jié)果:

Tips:有關(guān)如何編譯運(yùn)行的內(nèi)容請(qǐng)參考前面的章節(jié)。
Tips:同時(shí)值得注意的是,這個(gè)程序中的 _Generic 來(lái)自于 C11 標(biāo)準(zhǔn)中,所以在你之前可能看到的 C 語(yǔ)言的書籍中是沒有的。請(qǐng)大家不要使用過(guò)于古老的編譯器,請(qǐng)使用推薦的較新的編譯器。也就是支持 C11 以上標(biāo)準(zhǔn)的編譯器。具體情況可以參照你們所選擇的編譯器的手冊(cè)。或者直接選擇 GCC 7 及更新版本的編譯器。

a type: int, b type: int, c type: float, d type: float
a=b+c, a=5
type (b+c): float
d=b+c, d=5.141590

這里面的 a, b 變量為整形,而 c 和 d 都是浮點(diǎn)型。那么當(dāng)一個(gè)整形和一個(gè)浮點(diǎn)型相加的時(shí)候會(huì)發(fā)生什么呢?這就是我們今天要介紹的內(nèi)容。

1. 隱式類型轉(zhuǎn)換

C 語(yǔ)言是強(qiáng)類型語(yǔ)言,也就是說(shuō)不同類型的數(shù)據(jù)之間是不能進(jìn)行運(yùn)算的。必須保持一致的類型才能進(jìn)行運(yùn)算。也就是說(shuō)在這個(gè)不同數(shù)據(jù)類型的計(jì)算過(guò)程中,C 語(yǔ)言自動(dòng)進(jìn)行了一次類型轉(zhuǎn)換,使得兩個(gè)變量的數(shù)據(jù)類型一致,才能進(jìn)行相關(guān)的計(jì)算。這種自動(dòng)的轉(zhuǎn)換,也稱之為隱式類型轉(zhuǎn)換。

從前面提及的例子還可以看出,我們定義的數(shù)據(jù)類型,在不同的類型的數(shù)據(jù)運(yùn)算結(jié)束后,并沒有發(fā)生改變,也就是數(shù)據(jù)類型保持著我們最開始定義時(shí)候的類型。這時(shí)會(huì)發(fā)生丟棄精度的事情,也就是上面例子中小數(shù)點(diǎn)后面的數(shù)值就會(huì)消失。

那么這種隱式的轉(zhuǎn)換有什么規(guī)律可循嗎?

下面的表格就展示了類型轉(zhuǎn)換的規(guī)律,當(dāng)在計(jì)算過(guò)程中,數(shù)值類型不一致的時(shí)候,就會(huì)發(fā)生自動(dòng)的類型轉(zhuǎn)換,轉(zhuǎn)換的類型是將表格中處于下方的較低優(yōu)先級(jí)的數(shù)據(jù)類型,向表格上方的較高優(yōu)先級(jí)的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換。

級(jí)別 數(shù)據(jù)類型
1 long double
2 double
3 float
4 unsigned long long
5 long long
6 unsigned long
7 long
8 unsigned int
9 int
10 char short int

根據(jù)這個(gè)表格我們就可以看出之前的轉(zhuǎn)換中,int 與 float 類型進(jìn)行計(jì)算,編譯器會(huì)自動(dòng)將 int 類型轉(zhuǎn)換為 float 類型進(jìn)行計(jì)算。從而使得運(yùn)算在相同的數(shù)據(jù)類型間進(jìn)行。

2. 顯式類型轉(zhuǎn)換

如果說(shuō)隱式類型轉(zhuǎn)換是編譯器自動(dòng)進(jìn)行的類型轉(zhuǎn)換,那么顯式類型轉(zhuǎn)換,則是我們?nèi)藶榈倪M(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換,這里可以理解為是一種強(qiáng)制的類型的轉(zhuǎn)換,這種轉(zhuǎn)換將不再遵守上面的轉(zhuǎn)換規(guī)則,而是按照我們?nèi)藶榈臉?biāo)明的類型進(jìn)行轉(zhuǎn)換。

就是在我們需要指定類型的變量前加上數(shù)據(jù)類型,并用圓括號(hào)包裹。例如: (int)a, (float)b, (long)c 等。

下面我們通過(guò)一個(gè)示例程序來(lái)看一下顯式類型轉(zhuǎn)換:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
#include <stdio.h>

#define typename(x) _Generic((x),        /* Get the name of a type */             \
                                                                                  \
        _Bool: "_Bool",                  unsigned char: "unsigned char",          \
         char: "char",                     signed char: "signed char",            \
    short int: "short int",         unsigned short int: "unsigned short int",     \
          int: "int",                     unsigned int: "unsigned int",           \
     long int: "long int",           unsigned long int: "unsigned long int",      \
long long int: "long long int", unsigned long long int: "unsigned long long int", \
        float: "float",                         double: "double",                 \
  long double: "long double",                   char *: "pointer to char",        \
       void *: "pointer to void",                int *: "pointer to int",         \
      default: "other")

int main()
{
    int a=1,b=2;
    float c=3.14159,d=0;
    printf("a type: %s, b type: %s, c type: %s, d type: %s\n",typename(a),typename(b),typename(c),typename(d));
    a=(float)b+(float)c;
    printf("a=b+c, a=%d\n",a);
    printf("type (b+c): %s\n",typename((int)b+(int)c));
    d=(int)b+(int)c;
    printf("d=b+c, d=%f\n",d);
    return 0;
}#include <stdio.h>

#define typename(x) _Generic((x),        /* Get the name of a type */             \
                                                                                  \
        _Bool: "_Bool",                  unsigned char: "unsigned char",          \
         char: "char",                     signed char: "signed char",            \
    short int: "short int",         unsigned short int: "unsigned short int",     \
          int: "int",                     unsigned int: "unsigned int",           \
     long int: "long int",           unsigned long int: "unsigned long int",      \
long long int: "long long int", unsigned long long int: "unsigned long long int", \
        float: "float",                         double: "double",                 \
  long double: "long double",                   char *: "pointer to char",        \
       void *: "pointer to void",                int *: "pointer to int",         \
      default: "other")

int main()
{
    int a=1,b=2;
    float c=3.14159,d=0;
    printf("a type: %s, b type: %s, c type: %s, d type: %s\n",typename(a),typename(b),typename(c),typename(d));
    a=(float)b+(float)c;
    printf("a=b+c, a=%d\n",a);
    printf("type (b+c): %s\n",typename((int)b+(int)c));
    d=(int)b+(int)c;
    printf("d=b+c, d=%f\n",d);
    return 0;
}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

下面是執(zhí)行結(jié)果。

a type: int, b type: int, c type: float, d type: float
a=b+c, a=5
type (b+c): int
d=b+c, d=5.000000

通過(guò)顯式類型轉(zhuǎn)換,我們可以控制在計(jì)算過(guò)程中的數(shù)據(jù)類型。之前自動(dòng)轉(zhuǎn)換為 float 類型的數(shù)據(jù),在我們顯式指定為 int 類型后,計(jì)算過(guò)程中就會(huì)按照 int 類型來(lái)進(jìn)行計(jì)算。

3. 小結(jié)

對(duì)于隱式類型轉(zhuǎn)換。其實(shí)變化的原因主要是因?yàn)橛?jì)算的數(shù)值為了匹配計(jì)算精度而進(jìn)行的,一般情況下都是較低精度的變量類型會(huì)轉(zhuǎn)變?yōu)檩^高精度的變量類型。

而顯式類型轉(zhuǎn)換則是我們主動(dòng)控制了類型的精度,可以拋去我們不需要的高的精度。同時(shí),由于指定了類型,在轉(zhuǎn)換過(guò)程中不會(huì)產(chǎn)生歧義。

Tips: 請(qǐng)注意,這里在類型轉(zhuǎn)換的過(guò)程中不會(huì)自動(dòng)進(jìn)行四舍五入等操作,因此如果使用不當(dāng)會(huì)造成數(shù)據(jù)的精度丟失。