type 相关的几个试验

2024-06-08 07:12
文章标签 几个 相关 type 试验

本文主要是介绍type 相关的几个试验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.概要

typeid是一个操作符,它用于在运行时获取关于数据类型的信息。

在C语言中,类型定义(Type Definition)通常是通过使用关键字如 typedef 来创建新的类型名称(也称为类型别名),这些新的类型名称可以代表已存在的数据类型、结构体(struct)、联合体(union)或枚举(enum)等。 

2.代码

#include <iostream>
using namespace std;//typeid试验
namespace test1 {class  A{};void main() {const type_info& type = typeid(A);cout << type.name() << endl;}
}
//typedef试验
namespace test2 {//的应用场景有哪些typedef int myInt;typedef int (*My_fun)(int a, int b);int fun(int a, int b) {return a + b;}void main() {myInt a = 5;My_fun f = fun;int c = f(3, 5);cout << c << endl;}
}
//sizeof试验
namespace test3 {class  A{};class  B{int a;};class  C{int a;int b;};class  D{int a;int b;int fun(int a, int b) {return a + b;}};void main() {int a = 5;int b = sizeof(a);cout << b << endl;b = sizeof(A);cout << b << endl;b = sizeof(B);cout << b << endl;b = sizeof(C);cout << b << endl;b = sizeof(D);cout << b << endl;}
}
int main()
{test1::main();test2::main();test3::main();cout << "Hello World!\n";
}

3.运行结果

class test1::A
8
4
1
4
8
8
Hello World!

4.补充

1.c typeid

 

在C++中,typeid是一个操作符,它用于在运行时获取关于数据类型的信息。这是C++的RTTI(运行时类型识别)机制的一部分。typeid可以返回一个type_info对象的引用,该对象封装了有关数据类型的信息。

以下是一些关于typeid的要点:

  1. 用法typeid(expression) 或 typeid(type-name)

    • expression是一个表达式,其类型将被确定。
    • type-name是一个类型名称(如intMyClass等)。
  2. 注意typeid只能用于多态上下文中的指针或引用。如果你对一个非多态类型或值使用typeid,它将直接返回该类型的type_info,而不会进行任何动态解析。

  3. dynamic_cast一起使用:在多态环境中,typeiddynamic_cast通常一起使用来确保类型转换的安全性。

  4. 示例

#include <iostream>
#include <typeinfo>
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {};
int main() {
Base* basePtr = new Derived();
// 使用 typeid 检查指针所指向的对象的实际类型
if (typeid(*basePtr) == typeid(Derived)) {
std::cout << "It's a Derived object!" << std::endl;
} else {
std::cout << "It's not a Derived object!" << std::endl;
}
delete basePtr;
return 0;
}

在这个示例中,由于Base有一个虚析构函数(使其成为多态类型),所以我们可以使用typeid来检查basePtr实际指向的对象类型。

但是,如果你尝试对不是通过指针或引用访问的多态类型使用typeid,它将不会返回你期望的结果,因为它不会进行动态类型解析。

2.typeid的返回值是啥 

typeid操作符在C++中返回一个对std::type_info对象的引用,该对象封装了有关数据类型的信息。std::type_info是一个在<typeinfo>头文件中定义的类,它包含了关于数据类型(如名称、是否是指针或引用等)的元信息。

std::type_info类的主要用途是允许程序在运行时查询有关数据类型的信息,但请注意,这个信息通常不包括类型的完整名称(例如,它不会返回如"int""MyClass"这样的字符串),而是返回一个能够唯一标识类型的内部标识符。

你可以使用std::type_info的成员函数name()来获取类型的名称,但返回的字符串格式是特定于实现的,并且可能不是人类可读的。通常,这个字符串主要用于调试和诊断目的,而不是用于显示给用户。

此外,std::type_info还提供了operator==()operator!=()来比较两个类型信息对象是否相同。

下面是一个简单的示例,展示了如何使用typeidstd::type_info

#include <iostream>
#include <typeinfo>
int main() {
int a = 0;
double b = 0.0;
// 获取a和b的类型信息
const std::type_info& info_a = typeid(a);
const std::type_info& info_b = typeid(b);
// 输出类型信息的名称(但注意这可能是编译器特定的)
std::cout << "Type of a: " << info_a.name() << std::endl;
std::cout << "Type of b: " << info_b.name() << std::endl;
// 比较两个类型信息对象是否相同
if (info_a == info_b) {
std::cout << "a and b are of the same type." << std::endl;
} else {
std::cout << "a and b are of different types." << std::endl;
}
return 0;
}

在这个示例中,info_a.name()info_b.name()将输出编译器特定的类型名称字符串,这些字符串可能不是人类可读的。而类型比较将正确地指出ab是不同类型的。

 

3.c 类型定义 

在C语言中,类型定义(Type Definition)通常是通过使用关键字如 typedef 来创建新的类型名称(也称为类型别名),这些新的类型名称可以代表已存在的数据类型、结构体(struct)、联合体(union)或枚举(enum)等。

使用 typedef 定义类型别名

typedef 关键字用于为已有的数据类型定义一个新的名称。这可以使代码更易于阅读和维护,特别是当使用复杂的数据类型时。

示例 1:为整数类型定义别名
typedef int Integer;
Integer a = 10; // 相当于 int a = 10;
示例 2:为结构体定义别名
typedef struct {
int x;
int y;
} Point;
Point p; // 创建一个Point类型的变量p
p.x = 10;
p.y = 20;

结构体(Struct)

结构体是一种复合数据类型,允许你将多个不同类型的数据组合成一个单一的类型。

struct Person {
char name[50];
int age;
};
struct Person person1; // 创建一个Person类型的变量person1
strcpy(person1.name, "Alice");
person1.age = 30;

联合体(Union)

联合体是一种特殊的数据结构,允许你在相同的内存位置存储不同的数据类型。但是,在任何时候,联合体只能存储其中一种类型的数据。

union Data {
int i;
float f;
char str[20];
};
union Data data;
data.i = 10; // 现在data存储一个整数
// ...
data.f = 220.5; // 现在data存储一个浮点数,之前存储的整数被覆盖

枚举(Enum)

枚举是一种用户定义的数据类型,它包含一组命名的整数值。默认情况下,枚举中的第一个枚举符的值为0,后面每个枚举符的值比前一个枚举符的值大1。但是,你也可以显式地为枚举符指定整数值。

enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
enum Days today = Mon; // today的值为1(假设Sun的值为0)

4.c 判断一个变量的类型 

在C语言中,与C++的typeid操作符不同,没有直接的方式来查询一个变量的类型并在运行时输出其类型名称。但是,你可以通过编写一些宏或函数来模拟这种功能,尽管这些方法通常不如C++中的typeid那样强大和灵活。

一种常见的方法是使用_Generic关键字(在C11及更高版本中可用),它允许你根据表达式的类型来选择不同的结果。但是,_Generic主要用于在编译时基于类型做出决策,而不是在运行时查询类型。

不过,你可以通过创建一些宏来模拟类型检查,但这些宏通常只能用于有限的一组类型,并且不能提供完整的类型名称。以下是一个简单的示例,该示例展示了如何使用宏来检查一个变量是否为整数类型:

#include <stdio.h>
#define IS_INT(x) _Generic((x), int: 1, default: 0)
int main() {
int a = 5;
float b = 3.14;
if (IS_INT(a)) {
printf("a is an integer.\n");
} else {
printf("a is not an integer.\n");
}
if (IS_INT(b)) {
printf("b is an integer.\n");
} else {
printf("b is not an integer.\n");
}
return 0;
}

在这个例子中,IS_INT宏使用_Generic来检查其参数是否为int类型。如果是,则返回1;否则返回0。然后,你可以根据这个宏的返回值来编写条件语句。

但是,请注意这种方法只能用于有限的一组类型,并且不能用于检查所有可能的类型。此外,它也不能提供关于类型的完整信息(如类型名称)。

如果你需要在C语言中实现更复杂的类型检查或类型信息获取功能,你可能需要考虑使用其他编程语言或工具,或者设计一种适合你特定需求的解决方案。在某些情况下,你可能需要手动跟踪和管理类型信息,以便在运行时使用。

 

这篇关于type 相关的几个试验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041496

相关文章

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

log4j2相关配置说明以及${sys:catalina.home}应用

${sys:catalina.home} 等价于 System.getProperty("catalina.home") 就是Tomcat的根目录:  C:\apache-tomcat-7.0.77 <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> 2017-08-10

Node Linux相关安装

下载经编译好的文件cd /optwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gztar -xvf node-v10.15.3-linux-x64.tar.gzln -s /opt/node-v10.15.3-linux-x64/bin/npm /usr/local/bin/ln -s /opt/nod

git ssh key相关

step1、进入.ssh文件夹   (windows下 下载git客户端)   cd ~/.ssh(windows mkdir ~/.ssh) step2、配置name和email git config --global user.name "你的名称"git config --global user.email "你的邮箱" step3、生成key ssh-keygen

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(