理解 《混沌 In C++::是类型?还是函数调用?》

原创 2004年07月02日 10:51:00

原文及评论见: 《混沌 In C++::是类型?还是函数调用?》http://blog.csdn.net/Jinhao/archive/2004/06/29/29021.aspx

  看了原文的评论,发现有不少人误解“函数声明怎么能当形参”。一开始,我也是一头雾水,但后来总算是理解了,就在这里稍微总结一下,也算是给自已提个醒吧。

  作者的代码我在 VC++.NET2003编译过。就目前来说,微软正式发布的C++编译器中,VC++.NET2003是最贴近C++标准的。也正因为如此,VC++.NET2003在编译VC++.NET2002和VC++6的时候,千万不要忽略其警告,因为这些警告往往是在指出VC++.NET2003与以前版本的不同(甚至是不兼容)之处,如果简单的忽略,代码的行为就可能不是你想要的。由于不是准备讨论这个问题,所以只给一个常见的例子:

  bool bIsOk = nFlags & 0x02 == 0x02;
  
//warning C4554: “&” : 检查运算符优先级可能存在的错误;使用圆括号阐明优先级

  在编译时,你应该注意到这个“警告”(我认为这是一个“错误”),并将代码改为:

  bool bIsOk = (nFlags & 0x02) == 0x02;

  • A a( A()) 到底是什么?

  目前存在两种说法:

    1. 函数声明
    2. 变量声明

  支持 “(2) 变量声明” 这个观点的人认为,A()是调用“默认构造函数”构造一个A类型的临时变量,然后再调用A的“拷贝构造函数”构造一个A类型的变量a。

  让我们先看看下面的代码表示什么:

A a();

  这是变量声明吗?不是的,用默认构造函数声明一个变量应该写作:A a;;它应该是函数声明:该函数名称为a,没有参数,返回值为A类型。

  我们再看看 A() 是什么?实际上,在不同场合,A() 有不同的意义:

  1. 单独使用: A();
    表示:struct A __cdecl(void),这是一个匿名的函数声明。
  2. 函数声明中:void func(A());
    表示:void __cdecl func(struct A (__cdecl*)(void)) ,很显然,这里A()就变成了一个函数指针声明:struct A (__cdecl*)(void)。
  3. 在表达式中:?for_each(arr, arr+3, A());
    在这里,A() 才能当作一个表达式,很显然,唯有“默认构造函数”才能符合该用途。

  现在再来解决 A a( A()) 是什么东西?在这里,当同时可以解释成函数声明和变量声明的场合,函数声明优先。

  A a (A(), 3) ,就只能解释成变量声明(调用一般构造函数)。

  A a = A(),也只能解释成变量声明(调用拷贝构造函数)。

  • 这篇文章的意义在哪里?

  有一部份人认为这篇文章没有意义,甚至无聊,更甚者认为是在混淆视听。理由是,写程序者要有好的编码风格,比如:

  1. A a (A()) 如果是变量声明,就应该写成: A a = A()。
  2. A a (A()) 如果是函数声明,就应该写成: A a(A (*) ())。

  这说法没错,而且好的风格极其重要。

  但是,许多人却常常犯下类似的错误,并不是因为编码风格不好,而恰恰是对该文章要表达的内容不了解造成的。一个最常见的错误如下:

A a()

  本意可能是想声明一个变量,结果却变成函数声明。就是因为习惯性的加上了括号造成的。而如果没有意识到这是一个函数声明的话,可能就不太清楚到底错在哪里。

混沌系统解释

混沌系统解释
  • wik_123
  • wik_123
  • 2013年01月05日 11:09
  • 11116

如何理解c和c++的复杂类型声明

首先,让我们看看指针与const结合的声明: const int *p;      //p是指向常整形的指针 int const *p;     //错误 int * const p;   //...
  • fupacker
  • fupacker
  • 2014年04月15日 21:09
  • 1968

C++动态类型与静态类型

大多数情况下对象的静态类型和动态类型相同,我们不用关系二者区别;只有多态情况下,即在有虚函数的继承体系中,通过基类的指针或引用调用虚函数时,这时我们就需要关系指针或引用对象的动态类型,因为它们的静态类...
  • qq_26849233
  • qq_26849233
  • 2017年07月21日 15:00
  • 169

混沌,分形与人工智能

混沌这里所说的混沌并不是混乱之意,而是世间万物的一种属性。人们试图找到自然界事物发展的一定定律,然后用数学公式抽象出来,希望能预测将来事物发展轨迹,大部分时候可以奏效,但是极少时候也会出现问题,出现不...
  • LXYTSOS
  • LXYTSOS
  • 2015年09月24日 12:31
  • 4319

Logistic混沌序列加密

Logistic混沌置乱,先不说有多复杂,其实很简单。 Logistic函数是源于一个人口统计的动力学系统,其系统方程形式如下:  X(k+1) = u * X(k) * [1 - X(k...
  • qq_23291783
  • qq_23291783
  • 2016年01月29日 09:48
  • 1399

【图像加密】图像处理之Logistic混沌序列加密

Logistic混沌序列加密。
  • hujingshuang
  • hujingshuang
  • 2015年05月14日 10:54
  • 3596

混沌方法的数字图像加密

Abstract:目前混沌系统与加密技术相结合是现如今最热门的一个课题,虽然有大量的加密算法面世,但是这些加密算法并不成熟,仍然需要进一步的研究。本文采用像素位置置乱变换和像素值替代变换相结合的加密思...
  • hlx371240
  • hlx371240
  • 2015年05月09日 20:01
  • 4964

混沌时间序列的几个例子

混沌时间序列的例子:虫口模型、洛伦兹方程(天气预报模型)、CHne's吸引子 奇怪吸引子、吸引子 几个例子的MATLB程序,可以看到混沌序列的样子...
  • ldj1208
  • ldj1208
  • 2016年07月12日 23:01
  • 1801

大数据时代的数学思维(2)-混沌产生随机数

逻辑斯蒂映射的形式为 x_(n+1)=ax_n(1-x_n), 其中a是参数,当a>=3.569946时,x的值不再振荡,进入混沌,在此之前,x的值处于稳定状态,a值较小时,稳定在某个固定值,较大...
  • u010255642
  • u010255642
  • 2013年08月29日 10:52
  • 1666

蔡氏电路混沌同步Multisim实现

前言:关于蔡氏电路混沌同步的文献网上很多,因此只给出具体实现方案。课程作业,仅供参考 1.   非线性负电阻的搭建 利用Multisim搭建如下: 图1 负电阻电路 图1所示负电阻由两个负电...
  • chenjianbo88
  • chenjianbo88
  • 2015年12月28日 15:28
  • 1839
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解 《混沌 In C++::是类型?还是函数调用?》
举报原因:
原因补充:

(最多只允许输入30个字)