C - 雜項運算子



除了主要的運算子類別(算術、邏輯、賦值等)之外,C 語言還使用以下同樣重要的運算子。讓我們討論一下此類別下的運算子。

“&”符號在 C 語言中已定義為**按位與運算子**,如果該位同時存在於兩個運算元中,則將其複製到結果中。“&”符號也定義為**取地址運算子**。

“*”符號 - 一個眾所周知的乘法算術運算子,它也可以用作**解引用運算子**。

C 語言使用“>”符號,定義為**三元運算子**,用於計算條件表示式。

在 C 語言中,點“.”符號用作與 struct 或 union 型別相關的成員訪問運算子。

C 語言還使用箭頭“→”符號作為間接運算子,尤其是在指向 struct 變數的指標中使用。

運算子 描述 示例
sizeof() 返回變數的大小。 sizeof(a),其中 a 是整數,將返回 4。
& 返回變數的地址。 &a; 返回變數的實際地址。
* 指向變數的指標。 *a;
?: 條件表示式。 如果條件為真?則為值 X,否則為值 Y
. 成員訪問運算子 var.member
訪問使用指標的 struct 變數的成員 ptr → member;

C 語言中的 sizeof 運算子

sizeof 運算子是一個編譯時一元運算子。它用於計算其運算元的大小,該運算元可以是資料型別或變數。它以位元組數返回大小。它可以應用於任何資料型別、浮點型別或指標型別變數。

sizeof(type or var);

當 sizeof() 與資料型別一起使用時,它只是返回分配給該資料型別的記憶體量。在不同的機器上,輸出可能不同,例如 32 位系統可以顯示不同的輸出,而 64 位系統可以顯示相同資料型別的不同輸出。

示例

這是一個 C 語言示例

#include <stdio.h>

int main(){

   int a = 16;
   
   printf("Size of variable a : %d\n",sizeof(a));
   printf("Size of int data type : %d\n",sizeof(int));
   printf("Size of char data type : %d\n",sizeof(char));
   printf("Size of float data type : %d\n",sizeof(float));
   printf("Size of double data type : %d\n",sizeof(double));   
 
   return 0;
}

輸出

執行此程式碼時,將產生以下輸出:

Size of variable a: 4
Size of int data type: 4
Size of char data type: 1
Size of float data type: 4
Size of double data type: 8

C 語言中的取地址運算子

“&”運算子返回現有變數的地址。我們可以將其賦值給指標變數:

int a;

假設編譯器在地址 1000 處建立變數,在地址 2000 處建立“**x**”,則“**a**”的地址儲存在“**x**”中。

Header Files

示例

讓我們藉助一個例子來理解這一點。在這裡,我們聲明瞭一個**int**變數。然後,我們列印它的值和地址:

#include <stdio.h>

int main(){

   int var = 100;
   
   printf("var: %d address: %d", var, &var);
   
   return 0;
}

輸出

執行程式碼並檢查其輸出:

var: 100 address: 931055924

C 語言中的解引用運算子

要宣告一個指標變數,需要使用以下語法:

type *var;

變數名前必須加星號 (*)。資料型別表示它可以儲存哪個資料型別的地址。例如:

int *x;

在這種情況下,變數 x 用於儲存另一個**int**變數的地址。

float *y;

“**y**”變數是一個指標,它儲存 float 變數的記憶體位置。

“&”運算子返回現有變數的地址。我們可以將其賦值給指標變數:

int a;
int *x = &a;

我們可以看到,此變數(任何型別的變數)的地址都是一個整數。因此,如果我們嘗試將其儲存在 int 型別的指標變數中,請檢視會發生什麼:

float var1 = 10.55;
int *intptr = &var1;

編譯器不接受此操作,並報告以下錯誤:

initialization of 'int *' from incompatible pointer type 'float *' [-Wincompatible-pointer-types]

這表明變數的型別及其指標的型別必須相同。

在 C 語言中,變數具有特定的資料型別,這些資料型別定義了它們的大小以及它們如何儲存值。使用匹配型別(例如,“**float *”**)宣告指標可強制執行指標與其指向的資料之間的型別相容性。

不同的資料型別在 C 語言中佔用不同的記憶體量。例如,int 通常佔用 4 個位元組,而 float 根據系統可能佔用 4 個或 8 個位元組。

從指標新增或減去整數會根據它們指向的資料大小在記憶體中移動它們。

因此,我們宣告 float * 型別的**floatptr**變數。

示例 1

看一下下面的例子:

#include <stdio.h>

int main(){

   float var1 = 10.55;
   float *floatptr = &var1;

   printf("var1: %f \naddress of var1: %d \n\nfloatptr: %d \naddress of floatptr: %d", var1, &var1, floatptr, &floatptr);

   return 0;
}

輸出

var1: 10.550000 
address of var1: 6422044 

floatptr: 6422044 
address of floatptr: 6422032

示例 2

* 運算子稱為解引用運算子。它返回儲存在指標中儲存的地址中的值,即它指向的變數的值。看一下下面的例子:

#include <stdio.h>

int main(){

   float var1 = 10.55;
   float *floatptr = &var1;

   printf("var1: %f address of var1: %d\n",var1, &var1);
   printf("floatptr: %d address of floatptr: %d\n", floatptr, &floatptr);
   printf("var1: %f value at floatptr: %f", var1, *floatptr);

   return 0;
}

輸出

執行此程式碼後,您將獲得以下輸出:

var1: 10.550000 address of var1: 6422044
floatptr: 6422044 address of floatptr: 6422032
var1: 10.550000 value at floatptr: 10.550000

C 語言中的三元運算子

在 C 語言中,“?”字元用作三元運算子。它也稱為**條件運算子**。

術語“三元”意味著該運算子具有三個運算元。三元運算子通常用於以緊湊的方式編寫條件(if-else)語句。

?運算子與以下**語法**一起使用:

exp1 ? exp2 : exp3

它具有以下**三個運算元**:

  • **exp1** - 一個布林表示式,計算結果為真或假
  • **exp2** - 當**exp1**為真時,?運算子返回的值
  • **exp3** - 當**exp1**為假時,?運算子返回的值

示例

以下 C 程式使用?運算子來檢查 a 的值是偶數還是奇數。

#include <stdio.h>

int main(){

   int a = 10;
   (a % 2==0) ? printf("%d is Even\n", a) : printf("%d is Odd\n", a);

   return 0;
}

輸出

10 is Even

將“a”的值更改為 15 並再次執行程式碼。現在您將獲得以下輸出:

15 is Odd

條件運算子是 if-else 結構的緊湊表示形式。

C 語言中的點 (.) 運算子

在 C 語言中,您可以使用 struct 和 union 關鍵字定義派生資料型別。派生或使用者定義的資料型別,它將不同型別的成員元素組合在一起。

點運算子是**成員選擇運算子**,當與 struct 或 union 變數一起使用時。點 (.) 運算子在 C 語言中具有**最高的運算子優先順序**,其結合性是從左到右。

看一下它的**語法**:

var.member;

這裡,var 是某種 struct 或 union 型別的變數,member 是建立結構體或聯合體時定義的元素之一。

使用 `struct` 關鍵字定義新的派生資料型別,語法如下:

struct newtype {
   type elem1;
   type elem2;
   type elem3;
   . . .
   . . .
};

然後,您可以宣告此派生資料型別的變數,如下所示:

struct newtype var;

要訪問某個成員,

var.elem1;

示例

讓我們宣告一個名為 book 的結構體型別,並宣告一個結構體變數。以下示例演示瞭如何使用 "." 運算子訪問 book 結構體中的成員。

#include <stdio.h>

struct book{
   char title[10];
   double price;
   int pages;
};

int main(){

   struct book b1 = {"Learn C", 675.50, 325};
   printf("Title: %s\n", b1.title);
   printf("Price: %lf\n", b1.price);
   printf("No of Pages: %d\n", b1.pages);
   printf("size of book struct: %d", sizeof(struct book));

   return 0;
}

輸出

執行此程式碼後,您將獲得以下輸出:

Title: Learn C
Price: 675.500000
No of Pages: 325
size of book struct: 32

C語言中的間接運算子

結構體是 C 語言中的一種派生資料型別。在 C 語言中,`struct` 關鍵字用於定義自定義資料型別。

使用 **`struct`** 關鍵字定義新的派生資料型別,**語法**如下:

struct type {
   type var1;
   type var2;
   type var3;
   . . .
   . . .
};

然後,您可以宣告此派生資料型別的變數,如下所示:

struct type = var;

通常,結構體的宣告位於程式中第一個函式定義之前,位於包含語句之後。這樣,派生型別就可以在任何函式內部用於宣告其變數。

讓我們宣告一個名為 book 的結構體型別,如下所示:

struct book {
   char title[10];
   double price;
   int pages;
};

要宣告此型別的變數,請使用以下語法:

struct book b1;

結構體變數的初始化是透過將每個元素的值放在花括號內來完成的。

struct book b1 = {"Learn C", 675.50, 325};

您還可以將結構體變數的地址儲存在結構體指標變數中。

struct book *strptr;

要儲存地址,請使用 "&" 運算子。

strptr = &b1;

C 語言定義了箭頭 (→) 符號,用於與結構體指標一起用作間接運算子(也稱為結構體反引用運算子)。它有助於訪問指標所引用的結構體變數的元素。

示例

在此示例中,`strptr` 是指向結構體 `book b1` 變數的指標。因此,`strrptr->title` 返回標題,類似於 `b1.title`。

#include <stdio.h>
#include <string.h>

struct book {
   char title[10];
   double price;
   int pages;
};

int main() {
   struct book b1 = {"Learn C", 675.50, 325};
   struct book *strptr;
   strptr = &b1;
   printf("Title: %s\n", strptr->title);
   printf("Price: %lf\n", strptr->price);
   printf("No of Pages: %d\n", strptr->pages);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

Title: Learn C
Price: 675.500000
No of Pages: 325
廣告