`
tomhibolu
  • 浏览: 1431567 次
文章分类
社区版块
存档分类
最新评论

C++小问题3则

 
阅读更多

问题1

有网友问这样一个问题:

Is there any way to use QString as a parameter in switch case as shown below.

QString str;
switch(str)
{
     case "A":
     break;
     case "B":
     break;
}

潜意识告诉我这样肯定不行,可是证据呢?连自己都说服不了,难受。

只好翻翻C++标准了。还好,很容易就找到了(ISO C++ 6.4 节):

  • switch 语句中的“条件”,必须是
    • 整数或enum类型的变量,或
    • 可以隐式转换成整数或enum类型的变量

由于QString没有 operator int() 这类的成员函数,故不可以。

标准原文:

  • The value of a condition that is an initialized declaration in a switch statement is the value of the declared variable if it has integral or enumeration type, or of that variable implicitly converted to integral or enumeration type otherwise.

恩,那么case后面可以是“A”这种东西么?ISO C++ 6.4.2,对此有规定:

  • case 后面必须是整数常量

标准原文:

  • Any statement within the switch statement can be labeled with one or more case labels as follows:
    case constant-expression :
    where the constant-expression shall be an integral constant.

问题二

void main(){
     int a = a;
}
A compiler通过, linker不能通过.
B compiler不能通过
C 视乎具体compiler而定

咱们忽略 main 函数的这个不规范的写法,假定它的意图就是问inta=a;这一句。

这个东西有没有问题?翻标准,恩 ISO C++ 3.3.2

没任何问题:

int x = 12;
{ int x = x; }

第二个x将使用它自己的值(尽管是不确定的值)进行初始化。与第一个x无关。

标准中还给出的其他的例子:

const int i = 2;
{ int i[i]; }

恩,和先前不同,块作用域内定义了一个两个整数元素的数组。

const int x = 12;
{ enum { x = x }; }

恩,对于枚举量,x的值初始化为12。也和先前不同。

标准原文(只贴出一段):

  • The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below. [ Example:
    int x = 12;
    { int x = x; }
    Here the second x is initialized with its own (indeterminate) value. — end example ]

问题三

使用typeid实验结果是:

typeid(int()) != typeid(int)
typeid(int()) != typeid(i)   // int i

so...
int()是啥东西?

恩,int() 是什么东西呢?

当我们这样写时,应该就比较清楚了

int a();

是一个函数的声明,那么 int() 就是函数类型了。

只是,有个疑问,楼主既然用到typeid了,为何不使用 type_info::name() 来输出类型信息看看呢?

于是写个例子:

#include <stdio.h>
#include <typeinfo>
int main()
{
    printf("%s\n", typeid(int()).name());
    printf("%s\n", typeid(int).name());
    return 0;
}

用GCC编译运行(如果用的MSVC,生成的可读性很好的字符串)

FivE
i

啊,难怪,原来这个和名字改编几乎一样的东西,很难读懂。既然输出都输出了,试试读读看:

GCC4使用的 Itanium C++ ABI,于是找到这个网页:

F...E

函数

i

返回值为 int

v

参数为 void

恩,简单的函数还好办,如果复杂的类型还真麻烦。幸好,GCC提供有demangle的函数:

恩,改写如下:

#include <stdio.h>
#include <typeinfo>
#include <cxxabi.h>
int main()
{
    char * realname = abi::__cxa_demangle(typeid(int()).name(), 0, 0, 0);
    printf("%10s ==> %15s\n", typeid(int()).name(), realname);

    realname = abi::__cxa_demangle(typeid(int(*)()).name(), 0, 0, 0);
    printf("%10s ==> %15s\n", typeid(int(*)()).name(), realname);

    realname = abi::__cxa_demangle(typeid(int).name(), 0, 0, 0);
    printf("%10s ==> %15s\n", typeid(int).name(), realname);
    return 0;
}

结果:

      FivE ==>        int ()()
     PFivE ==>       int (*)()
         i ==>             int

参考


分享到:
评论

相关推荐

    一个免费的c++小游戏集合

    《C++小游戏集合》 这个资源包集合了一个多样化的C++编程实现的小游戏,适合对C++编程感兴趣的初学者和爱好者。C++是一种强大的、通用的面向对象编程语言,以其高效性和灵活性闻名,广泛应用于游戏开发、系统软件、...

    使用C++编写的超级玛丽小游戏源码.zip

    使用C++编写的超级玛丽小游戏源码 使用C++编写的超级玛丽小游戏源码 使用C++编写的超级玛丽小游戏源码 使用C++编写的超级玛丽小游戏源码 使用C++编写的超级玛丽小游戏源码 使用C++编写的超级玛丽小游戏...

    C++小游戏 LightCycles (VisualCPP代码作业)

    C++小游戏 LightCycles (VisualCPP代码作业)C++小游戏 LightCycles (VisualCPP代码作业)C++小游戏 LightCycles (VisualCPP代码作业)C++小游戏 LightCycles (VisualCPP代码作业)C++小游戏 LightCycles (VisualCPP代码...

    c++ 百钱买鸡问题 百鸡问题

    百鸡问题是经典的数学问题,它...通过这个百鸡问题的C++实现,我们可以学习到如何将数学问题转化为编程问题,以及如何利用循环和条件判断来解决实际问题。这不仅锻炼了我们的逻辑思维能力,也加深了对C++语言的理解。

    好玩的C++小游戏,运行即可

    在本资源中,我们得到了一个名为“好玩的C++小游戏,运行即可”的压缩包,它包含了一个基于C++编程语言开发的小游戏。C++是一种强大的、面向对象的编程语言,常用于开发系统软件、游戏引擎、桌面应用以及各种高性能...

    小波算法的c++实现

    高频部分进一步分为水平、垂直和对角三个方向的小波系数。C++实现时,可以使用库如libwavelet或OpenCV,它们提供了现成的接口来执行二维小波变换和逆变换。 在C++中实现小波算法时,需要注意以下几点: 1. 数据结构...

    c++ 几个实用小程序

    本文将深入探讨标题和描述中提到的C++实用小程序,适合初学者进行编程实践。 1. **C++程序结构** C++程序通常由一个或多个源文件组成,每个源文件包含一个或多个函数。在初学者阶段,了解C++的基本结构至关重要。...

    C++常见问题解答

    3. **改进C++程序的最好方法是什么?** 改进C++程序的方法有很多,但关键在于实践和反思。首先,熟练掌握基本语法和标准库的使用;其次,不断练习编写各种规模的程序来加深理解;最后,阅读高质量的源代码,学习...

    三着色问题 C++

    三着色问题C++ 三着色问题C++

    一些c++小程序

    通过分析和运行这些小程序,不仅可以巩固C++的基础知识,还可以了解如何将理论应用于实际问题的解决。对于初学者来说,这是一种非常有效的学习方法,因为实践是理解编程概念的关键。同时,这些小程序也可以作为...

    DEV-C++小游戏(第三期)

    作者是新手,前两次格式发错了,补救一个DEV-c++小游戏大全

    C++/C++小型项目源码

    3. **STL(标准模板库)**:STL是C++的一个强大工具,包含容器(如vector、list、set等)、算法(如排序、查找等)和迭代器。通过源码,我们可以学习如何有效地使用这些工具来优化数据处理和算法实现。 4. **异常...

    c++小游戏编程源代码

    本项目中的源代码提供了三个小游戏的实现,这些游戏可以作为学习C++和游戏编程的实践案例。 1. **基础概念** 在C++中编程游戏需要理解以下几个核心概念: - **面向对象编程**:C++支持类和对象,这是游戏编程的...

    c++小程序代码

    在本压缩包中,我们主要关注的是"C++小程序代码",涵盖了多个小项目的源代码,包括数字迷宫、猜拳游戏以及日历系统。这些项目是学习和掌握C++编程语言的良好实践,可以帮助开发者深入理解面向对象编程的概念,以及...

    着色问题c++实现

    着色问题c++实现

    C++小游戏源码

    3. 绘图与图形库:C++本身并不支持图形绘制,但可以借助第三方库,如SDL(Simple DirectMedia Layer)、SFML(Simple and Fast Multimedia Library)或Allegro,来实现图形用户界面和动画效果。这些库提供了与硬件...

    收集和整理的c++小游戏合集(115个).rar

    收集和整理的c++小游戏合集(115个): ABS五子棋(win7).cpp Beat BIT.cpp flappy_bird1(比2更精致,但有闪屏问题).cpp gmon.out move闯关.cpp qwq.cpp UNO.cpp yourcraft.cpp 三国杀AI(偶尔有BUG).cpp 三子棋...

    C++小游戏(部分为他人制作,侵权立删)

    3. 模板和泛型编程:C++的模板功能使得我们可以编写通用的代码,如在游戏中创建一个可以处理不同类型对象的容器。这在管理游戏资源、实现游戏逻辑等方面非常有用。 4. 输入/输出流(I/O流):在游戏运行过程中,C++...

    用C++实现的经典小游戏源代码

    在本资源中,标题"用C++实现的经典小游戏源代码"揭示了主要的主题,即使用C++编程语言编写的经典小游戏的源代码。这通常包括一些基础和进阶的编程概念,适合学习C++和游戏开发的初学者,以及希望巩固编程技能的...

    C++小游戏 SpaceOut 3 (VisualCPP代码作业)

    C++小游戏 SpaceOut 3 (VisualCPP代码作业)C++小游戏 SpaceOut 3 (VisualCPP代码作业)C++小游戏 SpaceOut 3 (VisualCPP代码作业)C++小游戏 SpaceOut 3 (VisualCPP代码作业)C++小游戏 SpaceOut 3 (VisualCPP代码作业)...

Global site tag (gtag.js) - Google Analytics