- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++变量判定的螺旋法则示例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
C++ 中一个标识符配合着各种修饰界定符,使得标识符的本意不那么直观一眼就能看出,甚至需要仔细分析,才能知道该标识符的具体你含义.
比如:
1
|
void
(*
signal
(
int
,
void
(*fp)(
int
)))(
int
);
|
其中 signal 是什么?
螺旋法则 。
对于如何进行变量的辩识,有个非官方的 “顺时针/螺旋法则(Clockwise/Spiral Rule)” 可用来帮助辩识.
该法则的内容,简单来说,为了搞清楚一个未知标识符的含义,我们可以:
1、从我们需要判定的标识符开始,顺时针画圈,遇到如下符号时,用对应的语义替换:
2、重复上面的步骤直到语句中所有符号都被遍历过.
3、始终优先解析括号括起来的部分.
实地演练 。
一个简单的示例 。
先从一个简单的开始,判定如下语句中 str 的含义:
+-------+ | +-+ | | ^ | | char *str[10]; ^ ^ | | | +---+ | +-----------+ 。
根据螺旋法则,如上面线图标识所示, 。
进阶 。
回到文章开头那个语句,来判定其中 signal 的含义.
+-----------------------------+ | +---+ | | +---+ |+-+| | | ^ | |^ || | void (*signal(int, void (*fp)(int)))(int); ^ ^ | ^ ^ || | | +------+ | +--+| | | +--------+ | +----------------------------------+ 。
由螺旋法则画出如上的线图,进而可分析:
从要判定的 signal 出发首次遇到 ( 左括号,表示 signal 是一个函数,入参为 int 和 ... 。
此处需要需要进一步运用螺旋法则先确定 fp 的含义,才能进而确认 signal 这个函数的完整入参。所以从 fp 了发进行一次子螺旋.
因为需要优先解析括号括起来的部分,所以转一圈回来首次遇到的是 *,由此 fp 是一个指针.
继续解析 fp,遇到 (,所以 fp 是一个指向函数的指针,这个函数接收一个 int 类型的入参.
继续下去,遇到 void,所以 fp 是一个指向函数的指针,这个函数接收一个 int 类型的入参并且返回值为空.
至此完成了 fp 的解析,可以知道 signal 的类型为:
路径跑到 signal 的螺旋中,遇到 *(紧邻 signal 左边),所以 signal 是 。
再继续,遇到 (,接上面,返回值为指向另一函数的指针,被指向的这个函数接收一个 int 入参.
最后,遇到 void,signal 返回值指向的这个函数的返回值为空.
最后捋一下 signal 的完整类型为:接收一个 int,一个指向接收一个 int 并且返回值为空的函数的指针,这两个参数的函数,并且返回值为指向一个接收 int 型返回为空的函数...Orz.
成员函数的判定 。
螺旋施法没有给出在 const 参与的情况下的判定,不过因为 const 默认修饰紧邻其左边的元素,如果右边无元素,则修饰左边的元素。因此只需要将 const 和它修饰的元素作为整体来看,就还是可以使用螺旋法则的.
考察如下语句:
1
|
const
int
*
const
Method3(
const
int
*
const
&)
const
;
|
当函数后面紧跟一个 const 时,表示该成员函数的作用域内 *this 是常量,即无法在该函数体内对所类的实体进行修改.
下面对上面的语句进行分析:
相关资源 。
总结 。
以上就是我在处理客户端真实IP的方法,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我的支持.
原文链接:https://www.cnblogs.com/Wayou/p/cpp_clockwise_spiral_rule.html 。
最后此篇关于C++变量判定的螺旋法则示例详解的文章就讲到这里了,如果你想了解更多关于C++变量判定的螺旋法则示例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在 SO解释了为什么像 scalaz、cats (Scala) 或 Arrow (Kotlin) 中的 Validation 不能是 monad。 据我所知,这是因为他们已经根据应用仿函数对 mona
给定例如像 这样的类型 data Tree a = Branch (Tree a) (Tree a) | Leaf a 我可以轻松地为 Functor、Applicative、
从这里引用:https://en.wikipedia.org/wiki/Law_of_Demeter More formally, the Law of Demeter for functions r
以下代码打破了 Law of Demeter : public class Student extends Person { private Grades grades; public Stu
我有一个简单的 Store 类,其中包含一个 Inventory。 Inventory 包含一个 Item 列表。为了修改 Inventory 中的其中一个 Item,我必须这样写: Store st
public class BigPerformance { public decimal Value { get; set; } } public class Performance
当我需要多态行为时,我经常发现自己在 C++ 中使用唯一指针。我通常实现如下所示的纯抽象类: class A { public: virtual A* clone() const = 0; /
5 规则指出,如果一个类有一个用户声明的析构函数、复制构造函数、复制赋值构造函数、移动构造函数或移动赋值构造函数,那么它必须有其他 4 个。 但今天我突然明白了:你什么时候需要用户定义的析构函数、复制
编译器或库的更“ native ”部分(IO 或可以访问黑魔法和实现的函数)是否对这些定律做出假设?打破它们会导致不可能的事情发生吗? 或者它们只是表达了一种编程模式——也就是说,你唯一会因为破坏它们
我有点想用 Java 8 流编写 Selenium 页面对象,如下面的代码所述,并收到评论说我的代码违反了 Demeter 法则,因为我在一行中执行了很多操作。我被建议将代码分解为第一个流以收集列表并
我对如何避免一对多关联违反得墨忒耳法则感到困惑。假设我有一个这样的模型: class Organization < ActiveRecord::Base has_one :address ha
如果我有一个对象的 ArrayList,那么任何时候我需要调用 ArrayList 成员的任何方法时,我都需要这样做: list.get(i).doSomething(); 这看起来很可疑地违反了 D
我在我的 Purescript 代码中广泛使用了来自库和我自己的类型类。每个类型类法则似乎都提供了一个很好的测试。目前,我正在为每个类(class)和法律单独编写测试。有没有办法部分自动化?也许像 H
我看到提到过 ListT is a classic example of a buggy monad transformer that doesn't satisfy the monad laws.
当我审查一些代码时,我看到了这个片段。 List users = /* Some code that initializes the list */; users.stream() .fil
我是一名优秀的程序员,十分优秀!