Cast 运算符 ()

强制类型转换表达式语法

读取语法图跳过可视语法图(类型)表达式

仅限 C在C语言中, cast操作的结果不是左值。仅限 C

仅限 C + +在C++中,转换结果属于以下值类别之一:
  • 如果 type 是左值引用类型 C++11或函数类型的右值引用C++11 ,则转换结果为左值。
  • C++11如果 type 是对象类型的右值引用,则转换结果为瞬时值。C++11
  • 在所有其他情况下,求值结果均为 C++11 (左值)C++11 (右值)。
仅限 C + +
以下示例演示如何使用强制类型转换运算符动态创建大小为 10 的整数数组:
#include <stdlib.h>

int main(void) {
   int* myArray = (int*) malloc(10 * sizeof(int));
   free(myArray);
   return 0;
}
malloc 库函数返回一个 void 指针,该指针指向保存其自变量大小的对象的内存。 语句 int* myArray = (int*) malloc(10 * sizeof(int)) 具有以下步骤:
  • 创建指向可容纳十个整数的内存的空指针。
  • 使用强制类型转换运算符将该 void 指针转换为整数指针。
  • 将该整数指针分配给 myArray
仅开始 C++ 在C++中,您还可以在转换表达式中使用以下对象:
  • 函数式强制类型转换
  • C++ 转换运算符,例如 static_cast
函数式表示法将 expression 的值转换为类型 type:
type(expression)
以下示例显示了使用 C 样式强制类型转换, C++ 函数式强制类型转换和 C++ 强制类型转换运算符进行的相同值强制类型转换:
#include <iostream>
using namespace std;

int main() {
  float num = 98.76;
  int x1 = (int) num;
  int x2 = int(num);
  int x3 = static_cast<int>(num);

  cout << "x1 = " << x1 << endl;
  cout << "x2 = " << x2 << endl;
  cout << "x3 = " << x3 << endl;
}
请参阅以上示例的输出:
x1 = 98
x2 = 98
x3 = 98
将为整数 x1 指定一个值,在该值中, num 已显式转换为具有 C 样式强制类型转换的 int 。 将为整数 x2 分配一个已通过函数样式强制类型转换转换的值。 将为整数 x3 分配一个已使用 static_cast 运算符转换的值。

对于 C++ ,强制类型转换表达式的操作数可以具有类类型。 如果操作数具有类类型,那么可以将其强制转换为该类具有用户定义的转换函数的任何类型。 强制转型可以调用构造函数 (如果目标类型是类) ,也可以调用转换函数 (如果源类型是类)。 如果两个条件都成立,则可能模棱两可。 仅结束 C++

强制转换为并集类型 (仅限 C) (IBM 扩展)

强制类型转换为并集类型是将并集成员强制类型转换为其所属并集类型的能力。 这样的强制类型转换不会生成 lvalue。 支持此功能作为 C99的扩展,实现此功能是为了便于移植使用 GNU C 开发的程序。

只有作为联合类型的成员显式存在的类型才能强制转换为该联合类型。 强制类型转换可以使用联合类型的标记或在 typedef 表达式中声明的联合类型名称。 指定的类型必须是完整并集类型。 匿名并集类型可以在强制类型转换为并集类型时使用,前提是它具有标记或类型名称。 可以将位字段强制转换为并集类型,前提是并集包含相同类型的位字段成员,但不一定具有相同长度。 以下 代码 显示了要联合的简单强制类型转换的示例:
#include <stdio.h>

union f {
   char t;
   short u;
   int v;
   long w;
   long long x;
   float y;
   double z;
};

int main() {
  union f u;
  char a = 1;
  u = (union f)a;
  printf("u = %i\n", u.t);
} 
此示例的输出为:
u = 1
还允许对嵌套并集进行强制类型转换。 在以下示例中,可以将 double 类型 dd 强制转换为嵌套并集 u2_t
int main() {
   union u_t {
      char a;
      short b;
      int c;
      union u2_t {
         double d;
      }u2;
   };
   union u_t U;
   double dd = 1.234;
   U.u2 = (union u2_t) dd;      // Valid.
   printf("U.u2 is %f\n", U.u2);
}
此示例的输出为:
U.u2 is 1.234
并集强制类型转换作为函数自变量 (用于初始化 静态或非静态数据对象的常量表达式的一部分) 以及在复合字面值语句中也有效。 以下示例显示了要联合的强制类型转换,该强制类型转换用作用于初始化静态对象的表达式的一部分:
struct S{
  int a;
}s;

union U{
  struct S *s;
};

struct T{
  union U u;
};

static struct T t[] = { {(union U)&s} };