日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析

發布時間:2023/12/10 pytorch 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 enum 枚舉類型的使用方法
      • 1.1 enum枚舉類型的特殊意義
      • 1.2 代碼分析:enum的使用
    • 2 sizeof 關鍵字的用法
      • 2.1 代碼案例分析:sizeof的本質
    • 3 typedef的意義
      • 3.1 代碼案例:typedef 的使用案例
    • 4 總結

1 enum 枚舉類型的使用方法

  • enum是C語言中的一種自定義類型
  • enum是可以根據需要自定義的整形值
  • 第一個自定義的enum值默認為0
  • 默認情況下,enum值是在前一個定義值的基礎上加1
  • enum類型的變量只能取定義時的離散值,如:

  • 上面的代碼打印結果是0。所以說enum的變量大小是enum這個結構里面存的值的某一個。如上。

注意:enum中的各個變量之間是逗號隔開的。

1.1 enum枚舉類型的特殊意義

  • enum定義的值是C語言中真正意義上的常量,且是整型常量

具體如何定義常量,使用無名枚舉,如下圖所示:

  • 使用上述無名枚舉,可以定義真正意義上的常量。所以上述定義數組時可以直接用ARRAY_SIZE作為數組的大小。

1.2 代碼分析:enum的使用

  • 代碼11-1-lyy.c:
#include <stdio.h>enum {ARRAY_SIZE = 5 };enum Color {RED = 0x00FF0000,GREEN = 0x0000FF00,BLUE = 0x000000FF, };void PrintColor(enum Color c){switch(c){case RED:printf("Color : (0x%08x)\n", c);break;case GREEN:printf("Color : (0x%08x)\n", c);break;case BLUE:printf("Color : (0x%08x)\n", c);break;default:printf("Error!\n");break;} }void InitArray(int array[]){int i = 0;for(i = 0;i < ARRAY_SIZE;++i){array[i] = i+1;} }void PrintArray(int array[]){int i = 0;for(i = 0;i < ARRAY_SIZE;++i){printf("array[%d] = %d\n", i,array[i]);} } int main(){enum Color c = BLUE;PrintColor(c);int array[ARRAY_SIZE] = {0};InitArray(array);PrintArray(array); return 0; }
  • 上述代碼編譯運行結果為(gcc 4.4.5編譯器)::

可以看出,無名enum確實可以定義真正的常量。且使用enum類型,可以定義一組離散數據,該enum變量是這一組離散數據中的一個

2 sizeof 關鍵字的用法

注意;sizeof是C語言中的關鍵字,并不是函數。就像new/delete是C++的關鍵字而非函數一樣

  • sizeof是C元編譯器的內置指示符
  • sizeof用于計算 類型 或者 變量 所占用內存的大小
  • sizeof 的值在編譯期就已經確定大小。之前學過的const也是在編譯期間有效,運行期間無效。后面還有解釋
  • sizeof 用于類型時是這樣表述的:sizeof(type);
  • sizeof 用于變量時可以有兩種表述方法:sizeof(var) ; 或者 sizeof var ;

如下圖:

注意:

  • sizeof 在編譯期間,將被具體的數值替換,程序執行過程中與sizeof沒有任何關系
  • 比如下面的代碼,執行后打印什么?

上述代碼執行后,var的值依然是0 。因為sizeof在編譯期間就確定了具體的數值。而var++ 是需要在程序運行時計算的,所以實際上var++ 在程序運行期間就沒有被執行,因為在編譯期間sizeof(var++)已經確定了值為4.

2.1 代碼案例分析:sizeof的本質

  • 代碼:11-2-lyy.c
#include <stdio.h>int f(){printf("Lyy_Leran_C\n");return 0; } int main(){int var = 0;int size = sizeof(var++);printf("size = %d, var = %d\n",size,var);size = sizeof(f());//這之間并不打印 "Lyy_Leran_C"printf("size = %d\n",size);return 0; }
  • 上述代碼編譯運行結果為:

可以看出,上述代碼中,var變量的值依然是0,沒有變化,而且并沒有打印出字符串“Lyy_Leran_C” ,說明函數f() 也并沒有被執行。
以上充分說明了,sizeof在編譯期間就已經確定了值的大小。運行期間就與sizeof沒有任何關系了

3 typedef的意義

有一種說法是錯誤的:typedef 是用于定義一種新的的類型。。。。。

注意,typedef不是用來定義新類型的,而是給已經存在的數據類型取一個別名(或者叫重命名)!!!

  • typedef用于給一個已經存在的數據類型重命名
  • typedef 本質上是不能產生新類型的
  • typedef 不能被 unsigned 或者signed 修飾 。這在下面的代碼案例中可以看到
  • typedef 的用法:typedef type new_name ;
  • 可以在typedef 語句之后定義類型 。后面的代碼示例會解釋這句話的含義

3.1 代碼案例:typedef 的使用案例

  • 代碼:11-3-lyy.c
#include <stdio.h>typedef int Int32;struct _tag_point{int x;int y; };typedef struct _tag_point Point;typedef struct {int len;int array[]; } SoftArray;typedef struct _tag_list_node ListNode; struct _tag_list_node{ListNode* next; };int main(){Int32 i = -100; //int //unsigned Int32 ii = 0; //errorPoint p; //struct _tag_point;SoftArray* sa = NULL; ListNode* node = NULL; //struct _tag_list_node*return 0; }
  • 上述代碼中的第25行如果不注釋掉的話,程序編譯錯誤。這就是之前提到過的typedef 不能被 unsigned 或者signed 修飾
  • 將25行注釋掉后,程序編譯通過。沒有具體輸出,知道如何使用即可
  • 并且上述代碼中第17行使用的struct _tag_list_node 類型是在后面定義的。 這是允許的

4 總結

  • enum 用于定義離散值類型
  • 無名enum 定義的值是真正的常量
  • sizeof 是編譯器內置的指示符
  • sizeof 不參與程序的執行過程
  • typedef 用于給已經存在的類型重命名
  • 重命名的類型可以在typedef 語句之后定義

總結

以上是生活随笔為你收集整理的【C语言进阶深度学习记录】十一 C语言中enum,sizeof,typedef分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。