Cprogramming 简明教程

C - Misc Operators

除了主要的操作符类别(算术、逻辑、赋值等),C 使用了以下同样重要的操作符。我们来讨论在此类别下分类的操作符。

该符号“&”,已经在 C 中被定义为 Binary AND Operator ,如果它存在于两个运算对象中,则它会将位复制到结果中。该符号“&”也被定义为 address−of operator.

" symbol − A well−known arithmetic operator for multiplication, it can also be used as a *dereference operator.

C 使用“>”符号,定义为 ternary operator, 用于计算条件表达式。

在 C 中,点符号“.”用作与结构或联合类型有关的成员访问运算符。

C 还使用箭头“→”符号作为间接寻址运算符,特别用于指向结构变量的指针。

Operator

Description

Example

sizeof()

返回变量的大小。

sizeof(a),其中 a 是整数,将返回 4。

&

返回变量的地址。

&a;返回变量的实际地址。

*

Pointer to a variable.

*a;

?:

Conditional Expression.

如果条件为真?那么值为 X,否则值为 Y

.

Member access operator

var.member

−>

使用指针访问结构变量的成员

ptr −> member;

The sizeof Operator in C

sizeof 运算符是编译时一元运算符。它用于计算其操作数的大小,操作数可能为数据类型或变量。它以字节数返回大小。它可以应用于任何数据类型、浮点类型或指针类型变量。

sizeof(type or var);

当把 sizeof() 与数据类型一起使用时,它仅仅返回分配给该数据类型的内存量。输出在不同的机器上可能不同,比如 32 位系统可能显示不同输出,而 64 位系统可能显示相同数据类型的不同输出。

Example

以下是 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

Address-of Operator in C

“&”运算符返回现有变量的地址。我们可以将其分配给一个指针变量

int a;

假设编译器在地址 1000 创建变量并创建 x 在地址 2000,那么 a 的地址存储在 x 中。

header files

Example

让我们通过一个示例来理解这一点。在这里,我们声明了一个 int 变量。然后,我们打印其值和地址

#include <stdio.h>

int main(){

   int var = 100;

   printf("var: %d address: %d", var, &var);

   return 0;
}

运行代码并检查其输出:

var: 100 address: 931055924

The Dereference Operator in 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 个字节,取决于系统。

在指针中添加或减去整数根据这些指针所指向数据的大小,在内存中移动这些指针。

因此,我们声明 floatptr 变量为 float * 类型。

Example 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

Example 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

The Ternary Operator in C

在 C 语言中,?字符用作三元运算符。它也被称为 conditional operator.

“三元”一词表示运算符有三个操作数。三元运算符经常用于以紧凑的方式表达条件(if-else)语句。

?运算符与以下 syntax 搭配使用 −

exp1 ? exp2 : exp3

它具有以下 three operands

  1. exp1 − 一个布尔表达式,其值为 True 或 False

  2. exp2 − 当 exp1 为真时,由 ? 运算符返回

  3. exp3 − 当 exp1 为假时,由 ? 运算符返回

Example

以下 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构造的紧凑表示法。

The Dot (.) Operator in C

在C语言中,可以通过struct和union关键字定义一个派生数据类型。将不同类型成员元素分组在一起的派生或用户自定义数据类型。

与struct或union变量一起使用时,点操作符是一个 member selection operator, 。点(.)运算符具有 highest operator precedence in C 语言,其结合性是从左到右。

看看它的 syntax

var.member;

此处,var是某种struct或union类型的一个变量,member是在创建结构或联合时定义的一个元素。

使用 struct 关键字定义了新的派生数据类型,语法如下:

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

然后,你可以声明这种派生数据类型的变量如下 −

struct newtype var;

访问某个成员,

var.elem1;

Example

让我们声明一个名为book的struct类型,声明一个struct变量。以下示例显示了使用“.”运算符来访问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

The Indirection Operator in C

结构是C语言中的一种派生数据类型。在C语言中,struct关键字已提供用于定义自定义数据类型。

使用 struct 关键字定义新的派生数据类型,如下 syntax

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

然后,你可以声明这种派生数据类型的变量如下 −

struct type = var;

通常情况下,结构在程序中定义第一个函数之前,在include语句之后声明。这样,可以在任何函数内声明其变量,以用于派生类型。

让我们声明一个名为book的struct类型,如下所示:−

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

若要声明此类型的变量,请使用以下语法:−

struct book b1;

通过将每个元素的值放在大括号内来完成struct变量的初始化。

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

您还可以将struct变量的地址存储在struct指针变量中。

struct book *strptr;

若要存储地址,请使用“&”运算符。

strptr = &b1;

C定义了箭头(→)符号与struct指针一起用作间接操作符(也称为struct取消引用操作符)。它有助于访问指针引用到的struct变量的元素。

Example

在此示例中,strptr是struct 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