C 语言编程教程

C 语言 - 首页

C 语言基础

C 语言 - 概述 C 语言 - 特性 C 语言 - 发展历史 C 语言 - 环境设置 C 语言 - 程序结构 C 语言 - Hello World C - 编译过程 C - 注释 C - 标记 C - 关键字 C - 标识符 C - 用户输入 C - 基本语法 C - 数据类型 C - 变量 C - 整数提升 C - 类型转换 C - 类型转换 C - 布尔值

C 语言中的常量和文字

C - 常量 C - 字面量 C - 转义序列 C - 格式说明符

C 语言中的运算符

C - 运算符 C - 算术运算符 C - 关系运算符 C - 逻辑运算符 C - 位运算符 C - 赋值运算符 C - 一元运算符 C - 递增和递减运算符 C - 三元运算符 C - sizeof 运算符 C - 运算符优先级 C - 其他运算符

C 语言中的决策

C - 决策 C - if 语句 C - if...else 语句 C - 嵌套 if 语句 C - switch 语句 C - 嵌套 switch 语句

C 语言中的循环

C - 循环 C - While 循环 C - For 循环 C - Do...while 循环 C - 嵌套循环 C - 无限循环 C - Break 语句 C - Continue 语句 C - goto 语句

C 语言中的函数

C - 函数 C - Main 函数 C - 按值调用函数 C - 按引用调用函数 C - 嵌套函数 C - 可变参数函数 C - 用户定义函数 C - 回调函数 C - return 语句 C - 递归

C 语言中的作用域规则

C - 作用域规则 C - 静态变量 C - 全局变量

C 语言中的数组

C - 数组 C - 数组的属性 C - 多维数组 C - 将数组传递给函数 C - 从函数返回数组 C - 可变长度数组

C 语言中的指针

C - 指针 C - 指针和数组 C - 指针的应用 C - 指针运算 C - 指针数组 C - 指向指针的指针 C - 将指针传递给函数 C - 从函数返回指针 C - 函数指针 C - 指向数组的指针 C - 指向结构体的指针 C - 指针链 C - 指针 vs 数组 C - 字符指针和函数 C - NULL 指针 C - void 指针 C - 悬垂指针 C - 解引用指针 C - Near、Far 和 Huge 指针 C - 指针数组的初始化 C - 指针与多维数组

C 语言中的字符串

C - 字符串 C - 字符串数组 C - 特殊字符

C 语言的结构体和联合

C - 结构体 C - 结构体和函数 C - 结构体数组 C - 自引用结构 C - 查找表 C - 点 (.) 运算符 C - 枚举(或 enum) C - 结构填充和打包 C - 嵌套结构 C - 匿名结构和联合 C - 联合 C - Bit 位字段 C - Typedef

C 语言中的文件处理

C - 输入和输出 C - 文件 I/O(文件处理)

C 语言中的预处理器

C - 预处理器 C - #pragma 编译指示 C - 预处理器操作符 C - 宏 C - 头文件

C 语言中的内存管理

C - 内存管理 C - 内存地址 C - 存储类

C 其他主题

C - 错误处理 C - 可变参数 C - 命令执行 C - 数学函数 C - static 静态关键字 C - 随机数生成 C - 命令行参数

C 语言编程资源

C语言问题与解答答案 C语言快速指南 C语言速查表 C语言实用资源 C语言讨论


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