Delphi会自动初始化全局变量和类成员变量,但不初始化局部变量
If you don't explicitly initialize a global variable, the compiler initializes it to 0. Object instance data (fields) are also initialized to 0. On the Wiin32 platform, the contents of a local variable are undefined until a value is assigned to them.
所以只有局部变量的值需要程序员设定, AutoSize是TControl的Object instance data - FAutoSize, 所以它一定会被compiler初设为0(False).
--------------------------------------------------------------------------------
autosize是类里面的字段
类实例在初始时,会自动fillchar。
var
A: Boolean
是栈变量,临时性,随机性是栈变是的特性。
--------------------------------------------------------------------------------
参考:
ms-help://borland.bds4/bds4ref/html/Variables.htm
http://docwiki.embarcadero.com/RADStudio/XE8/en/Variables
--------------------------------------------------------------------------------
另外,Delphi会优化布尔表达式:
function TControl.CheckNewSize(var NewWidth, NewHeight: Integer): Boolean;
var
W, H, W2, H2: Integer;
begin
Result := False;
W := NewWidth; // cx
H := NewHeight; // cy
if DoCanResize(W, H) then // 类函数,给程序员控制的机会,然后再继续传递。程序员要求限制,才进行限制
begin
W2 := W;
H2 := H;
Result := not AutoSize // 通常情况下下AutoSize=false,这样Result就已经等于true
or (DoCanAutoSize(W2, H2) and (W2 = W) and (H2 = H)) // 问题: 编译器优化的话,还会执行这个函数吗?
or DoCanResize(W2, H2); // 这个函数也是如此
if Result then
begin
NewWidth := W2;
NewHeight := H2;
end;
end;
end;
我觉得上面的代码是故意为之:
Result := not AutoSize
or (DoCanAutoSize(W2, H2) and (W2 = W) and (H2 = H))
or DoCanResize(W2, H2);
也就是说,当autoSize=false的时候,就不用执行后面的函数了。只有autoSize=true的时候,才需要执行函数。而现实正是:只有控件运行自动扩展大小的时候,才需要执行后面的函数做进一步检查。
结论:Delphi编译器会优化布尔表达式。1楼的代码之所以这样写,是故意为之,正好符合现实的需求。这样写虽然容易迷惑,但也可认为是VCL创作人员的高超的技巧性。
参考:http://bbs.2ccc.com/topic.asp?topicid=496677
Delphi会自动初始化全局变量和类成员变量,但不初始化局部变量的更多相关文章
- c++ 类成员变量初始化总结
最近在学习c++,不同类型的c++成员变量在初始化的时候也有很有的区别,查了一些资料之后再此记录一下: #include<iostream> using namespace std; // ...
- 牛客网Java刷题知识点之全局变量(又称成员变量,分为类变量和实例变量)、局部变量、静态变量(又称为类变量)
不多说,直接上干货! 定义类其实就是在定义类中的成员.成员:成员变量<-->属性,成员函数<-->行为. 局部变量在方法内部声明,并且只能在方法内部使用,在外层的方法被调用时被 ...
- static 类成员变量 和 static const类成员变量
1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...
- Objective-C类成员变量深度剖析
目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...
- Qt一个project调用还有一个project的类成员变量
一句两句话已经不能表达如今的激动情绪了.唯有感叹知识的博大精深,并把感叹转变为文字. 同一个project调用其它类成员变量很easy. 如: 定义 Test1.h中申明成员变量 class A { ...
- Objective-C类成员变量深度剖析--oc对象内存模型
目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objec ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- C++---类成员变量定义为引用
摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #i ...
- c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用
c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用 c++不会像上图那样为每一个对象的成员变量和成员函数开辟内存空间, 而是像下图那样,只为每一个对象的成员变量开辟空间.成员 ...
随机推荐
- JSP执行过程详解
复习JSP的概念 JSP是Java Server Page的缩写,在传统的HTML页面中加入JSP标签和java的程序片段就构成了JSP. JSP的基本语法:两种注释类型.三个脚本元素.三个元素指令. ...
- Android代码混淆
混淆器(ProGuard) --- 混淆器通过删除从未用过的代码和使用晦涩名字重命名类.字段和方法,对代码进行压缩,优化和混淆.结果是一个比較小的.apk文件,该文件比較难进行逆向project.因此 ...
- Android的Touch系统简介(一)
一.Android touch事件的相关概念 用户的Touch事件被包装成MotionEvent 用户当前的touch事件主要类型有: ACTION_DOWN: 表示用户开始触摸. ACTION_MO ...
- 如何学习H264协议
如何学习h.264协议 首先,我假定你已经具有如下基础: 1 了解基本的视频知识,知道什么是YCbCr/YUV: 2 知道基本的视频压缩原理: 如果这两条还不具备,那么,停一下,补一下课.这方面的相关 ...
- VB 生成xml文件 并使用xsd验证
最近客户的一个需要,要求将数据以xml的形式发送. vb 实现代码 Private Function createXML_old(ByVal xmlName As String) As Boolean ...
- tabswitch
<!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> <met ...
- Word复制和替换实例
public string Path { get { DirectoryInfo info = new DirectoryInfo(Application.StartupPath); return i ...
- YII数据库增删查改操作
初学YII, 整理了一些YII数据库的相关操作, 共同学习,共同进步. 一.查询数据集合 //1.该方法是根据一个条件查询一个集合 $admin=Admin::model()->findAll ...
- 创建 序列 存储过程 job
掌握了 oracle中的 dbms_lock 函数,该函数 主要用于暂停执行的程序 1.用意 写job 以10分钟 为单元,前10分钟 从 1到10 插入测试表, 中间10分钟从 11到20插入测试表 ...
- getUrlParam,jQuery中的URL参数获取
大家经常会需要在一段URL中截取到自己所需参数的值,下面的方法也许能帮到您: $.getUrlParam = function(name){ var reg = new RegExp("(^ ...