C 语言中的一元运算符
虽然 C 语言中的大多数运算符本质上是二元的,但也有一些一元运算符。如果一个运算符只需要一个操作数,则称其为一元运算符,这与需要两个操作数的二元运算符不同。
C 语言中的某些运算符既是二元的,也是一元的。C 语言中一元运算符的示例包括 ++、--、! 等。
C 语言中的增量运算符
增量运算符 (++) 将 1 添加到其操作数变量的值上,并将其赋值回变量。
语句 a++ 等同于"a = a + 1"。"++"运算符可以出现在操作数之前或之后,效果相同。因此,a++ 等价于 ++a。
但是,当自增运算符与其他运算符一起出现在表达式中时,其效果并不相同。"前缀 ++"的优先级高于"后缀 ++"。因此,"b = a++;"与"b = ++a;"不同。
在前一种情况下,在自增之前将"a"赋值给"b";而在后一种情况下,增量先于赋值执行。
C 语言中的减量运算符
减量运算符 (--) 从其操作数变量的值中减 1,然后将其赋值回变量。
语句"a--;"等同于"a = a - 1;"
"--"运算符可以出现在操作数之前或之后,无论哪种情况,其效果都相同。因此,"a--"等同于"--a"。
但是,当减量运算符与其他运算符一起出现在表达式中时,其效果并不相同。"前缀 --"的优先级高于"后缀 --"。因此,"b = a--"与"b = --a"不同。
前一种情况下,"a"在减量之前赋值给"b";而后一种情况下,减量先于赋值执行。
C 语言中的一元"+"运算符
"+"和""运算符是众所周知的二元加法和减法运算符。然而,它们也可以以一元形式使用。当用作一元运算符时,它们被添加到操作数变量的前缀。
每当将正值赋值给任何数值变量时,"+"运算符都会隐式出现。语句"int x = 5;"与"int x = +5;"相同。同样的逻辑也适用于 float 和 char 变量。
示例
请看以下示例 -
#include <stdio.h> int main(){ char x = 'A'; char y = +x; float a = 1.55; float b = +a; printf ("x: %c y: %c ", x,y); printf ("a: %f y: %f ", a,b); return 0; }
输出
运行此代码时,将产生以下输出 -
x: A y: A a: 1.550000 y: 1.550000
C 语言中的一元"−"运算符
通常表示减法运算符的"−"符号在 C 语言中也用作一元取反运算符。以下代码展示了如何在 C 语言中使用一元取反运算符。
示例
在此代码中,一元取反运算符返回"x"的负值,并将其赋值给另一个变量"y"。
#include <stdio.h> int main(){ int x = 5; int y = -x; printf("x: %d y: %d ", x, y); return 0; }
输出
运行代码并检查其输出 −
x: 5 y: -5
C 语言中的地址运算符 (&)
在 C 语言中,我们使用 & 符号作为二元与运算符。然而,我们也以一元方式使用相同的 & 符号作为"地址运算符"。
示例
& 运算符返回其变量操作数的内存地址。请看以下示例 -
#include <stdio.h> int main(){ char x = 'A'; printf ("Address of x: %d ", &x); return 0; }
输出
运行代码并检查其输出 −
Address of x: 6422047
注意:每当声明变量时,C 编译器都会分配一个随机的内存地址。因此,每次打印该地址时,结果可能会有所不同。
格式说明符 %p 用于获取内存地址的十六进制表示形式。
char x = 'A'; printf ("Address of x: %p ", &x);
这将以十六进制格式打印"x"的地址 -
Address of x: 000000000061FE1F
变量的地址通常存储在"指针变量"中。指针变量声明时以"*"前缀开头。在下面的代码片段中,"x"是一个普通的整型变量,而"y"是一个指针变量。
int x = 10; int *y = &x;
C 语言中的解引用运算符 (*)
我们通常使用"*"符号作为乘法运算符。然而,它在 C 语言中也被用作"解引用运算符"。
当您想要存储变量的内存地址时,应在变量声明前添加星号 (*)。
int x = 10; int *y = &x;
这里变量"y"存储了"x"的地址,因此"y"充当指向"x"的指针。要借助指针访问"x"的值,请使用解引用运算符 (*)。
示例 1
请看以下示例 -
#include <stdio.h> int main(){ int x = 10; int *y = &x; printf ("x: %d Address of x: %d ", x, &x); printf("Value at x with Dereference: %d", *y); return 0; }
输出
运行代码并检查其输出 −
x: 10 Address of x: 6422036 Value at x with Dereference: 10
示例 2
您还可以借助解引用指针为原始变量赋值 -
#include <stdio.h> int main(){ int x = 10; int *y = &x; printf("x: %d Address of x %d ", x, &x); *y = 20; printf("x: %d with Dereference: %d", x, *y); return 0; }
输出
运行代码并检查其输出 −
x: 10 Address of x: 6422036 x: 20 with dereference: 20
C 语言中的逻辑非运算符 (!)
C 语言中的逻辑非运算符 (!) 对布尔操作数的值取反。True 变为 False,False 变为 True。逻辑非运算符 (!) 是一个一元运算符。
示例 1
以下示例展示了 C 语言中逻辑运算符的用法 -
#include <stdio.h> int main(){ int a = 0; int b = 20; if (!(a && b)){ printf("Line 1 - Condition is true " ); } return 0; }
输出
Line 1 - Condition is true
示例 2
以下 C 代码在 while 循环中使用 NOT 运算符 -
#include <stdio.h> int main(){ int i = 0; while (!(i > 5)){ printf("i = %d ", i); i++; } return 0; }
输出
在此代码中,while 循环持续迭代,直到表达式"!(i > 5)"变为 False,即"i"的值大于 5 时为止。
i = 0 i = 1 i = 2 i = 3 i = 4 i = 5
C 语言中的 1 的补码运算符 (~)
C 语言中的 1 的补码运算符 (~) 是一个一元运算符,只需要一个操作数。它的作用是"翻转"位,也就是说,在任何数字的二进制表示中,1 会被 0 替换,反之亦然。
a | ~a |
---|---|
0 | 1 |
1 | 0 |
假设 int 变量 "a" 的值为 60(相当于二进制的 0011 1100),则 "~a" 运算的结果为二进制补码形式的 -61,其对应位按位右移。
~ 0011 1100 = 1100 0011
二进制数 "1100 0011" 对应十进制的 -61。
示例
查看此示例代码 -
#include <stdio.h> int main(){ int a = 60; /* 60 = 0011 1100 */ int c = 0; c = ~a; /* -61 = 1100 0011 */ printf("Value of c is %d ", c); return 0; }
输出
运行此代码时,将产生以下输出 -
Value of c is -61