`
hqs7636
  • 浏览: 220965 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

语 句 3 (2.014)

阅读更多

18 Synchronized 语句
synchronized 语句用来在多线程情况下同步临界区内的语句。

Synchronized语句:
synchronized 作用域语句
synchronized ( 表达式 ) 作用域语句

synchronized 每次只允许一个线程 执行 作用域语句。

synchronized (表达式),其中的 表达式 会计算成一个 Object 引用,整个则同时只允许有一个线程在使用该 Object 来执行 作用域语句。如果 表达式 是 接口 的一个实例,则它会类型转换成一个 Object。


即使 作用域语句 由于异常、goto 或 return 被终止了,synchronization 也会被释放。
样例:
synchronized { ... }
这实现一个标准的临界区。


19 Try 语句

异常处理由 try-catch-finally 语句完成。

Try语句:
try 作用域语句 多个Catch
try 作用域语句 多个Catch Finally语句
try 作用域语句 Finally语句

多个Catch:
最后的Catch
Catch
Catch 多个Catch

最后的Catch:
catch 无作用域非空语句

Catch:
catch ( Catch参数 ) 无作用域非空语句

Finally语句:
finally 无作用域非空语句

Catch参数 声明类型为 T 的变量 v,这里的 T 是 Object 或继承自 Object。v 由抛出的表达式进行初始化,如果 T 具有跟抛出的表达式相同的类型或是其基类的话。如果异常对象的类型为 T 或者继承自 T,则该 catch 子句就会被执行。

如果只给定了类型 T 而没有变量 v,那么该 catch 依然会被执行。

如果有 Catch参数 类型 T1 隐藏了后面类型为 T2 的 Catch,则会产生一个错误;例如,
如果 T1 跟 T2 同类型或是 T2 的基类,则这就是一个错误。

最后的Catch 会捕捉所有的异常。

Finally语句 总是会被执行,无论是否 try 作用域语句 由于goto、break、continue、return、exception 或失败而退出。

如果一个异常在 Finally语句 里产生了,而在执行 FinallyStatement 之前没有被捕捉到,则新的表达式会替换所有原来的表达式:

import std.stdio;

int main()
{
try
{
try
{
throw new Exception("first");
}
finally
{
writefln("finally");
throw new Exception("second");
}
}
catch(Exception e)
{
writefln("catch %s", e.msg);
}
writefln("done");
return 0;
}

输出:
finally
catch second
done

Finally语句 不可能因为 goto、break、continue 或 return 而退出;也不可以因为 goto 而进入。
Finally语句 不可能包含任何的 Catches。在将来的版本中这个限制可以被放宽。


20 Throw 语句

抛出一个异常。

Throw语句:
throw 表达式 ;

表达式 被计算,结果必须是 Object 引用类型。该 Object 的引用被作为异常抛出。
throw new Exception("message");


21 作用域守护语句(Scope Guard Statement)

作用域守护语句:
scope(exit) 非空或无作用域块语句
scope(success) 非空或无作用域块语句
scope(failure) 非空或无作用域块语句

作用域守护语句 在当前作用域的 结束处 执行 非空或无作用域 块语句,而不是在 作用域守护语句 所在的那个地方执行。

scope(exit) 会在正常退出该作用域时或在由于异常展开而退出时执行 非空或无作用域块语句。

scope(failure) 会在由于异常展开退出该作用域时执行非空或无作用域块语句。

scope(success) 则会在正常退出该作用域时执行 非空或无作用域块语句。

如果在一个作用域内有多重 作用域守护语句,那么它们执行的顺序则跟它们在词法上出现
的顺序相反。如果有 auto 实例在访作用域结束处被析构,那么它们也以跟词法上相反的顺
序跟 作用域守护语句 交叉在一起。

writef("1");
{
writef("2");
scope(exit) writef("3");
scope(exit) writef("4");
writef("5");
}
writefln();

输出:
12543
{
scope(exit) writef("1");
scope(success) writef("2");
scope(exit) writef("3");
scope(success) writef("4");
}
writefln();

输出:
4321
class Foo
{
this() { writef("0"); }
~this() { writef("1"); }
}
try
{
scope(exit) writef("2");
scope(success) writef("3");
auto Foo f = new Foo();
scope(failure) writef("4");
throw new Exception("msg");
scope(exit) writef("5");
scope(success) writef("6");
scope(failure) writef("7");
}
catch (Exception e)
{}
writefln();

输出:
0412

scope(exit) 或 scope(success) 语句不可能由于 throw、goto、break、continue 或 return 退
出;也不可能由于 goto 而进入。

  2.014中没有
22 Volatile 语句
[color=red]没有什么代码活动能跨越 volatile 语句的边界。[/color]

Volatile语句:
volatile 语句
volatile ;

语句 会被计算。在 语句 之前的所有内存写操作都保证在 语句 中或其后的内存读操作之
前完成。在 语句 之后的所有内存读操作都保证在 语句 中或其前的所有内存写完成之后执
行。

[color=red]volatile 语句不能保证原子性。为了该目的,应该使用 synchronized 语句。[/color]

23 Asm 语句
asm 语句用来支持内联汇编:

Asm语句:

asm { }
asm { Asm指令列表 }
Asm指令列表:
Asm指令 ;
Asm指令 ; Asm指令列表

asm 语句使你可以直接使用汇编语言指令。这样不必费力地采用外部的汇编程序就可以获得
对CPU特殊特征的直接访问能力。D 编译器会替你管理函数调用约定、堆栈设置等等恼人
的事情。

指令的格式,当然,高度依赖于目标CPU的指令集,所以是由 实现定义 的。但是,格式
需要遵循下述约定:

• 必须使用同 D 语言相同的记号。
• 注释的形式必须同 D 语言的相通。
• Asm 指令以‘;’结尾,而不是以行尾结尾。

这些规则保证 D 的源代码可以独立于语法或语义分析而被记号化。

例如,对于 Intel Pentium 处理器:

int x = 3;
asm
{
mov EAX,x; // 将 x 载入寄存器 EAX
}

内联汇编可以用来直接访问硬件:
int gethardware()
{
asm
{
mov EAX, dword ptr 0x1234;
}
}

对于某些 D 实现,如将 D 翻译为 C 的翻译器来说,内联汇编没有什么意义,也就不需要
实现它。version 语句可以用来应付这种情况:

version (D_InlineAsm_X86)
{
asm
{
...
}
}
else
{
/* ... some workaround ... */
}

24 Pragma 语句

Pragma语句:
Pragma 无作用域语句

25 Mixin 语句

Mixin语句:
mixin ( 赋值表达式 ) ;
赋值表达式 必须在编译时求值成一个常量字符串。该字符串的文本内容必须要可编译成一
个有效的语句列表,而且同样地被编译。

import std.stdio;
void main()
{
int j;
mixin("
int x = 3;
for (int i = 0; i < 3; i++)
writefln(x + i, ++j);
"); // 正确
const char[] s = "int y;";


  2.014
26 Foreach Range Statement

A foreach range statement loops over the specified range. 
ForeachRangeStatement:
    Foreach (ForeachType; LwrExpression .. UprExpression ) ScopeStatement

LwrExpression:
    Expression

UprExpression:
    Expression
ForeachType declares a variable with either an explicit type, or a type inferred from LwrExpression and UprExpression. The ScopeStatement is then executed n times, where n is the result of UprExpression - LwrExpression. If UprExpression is less than or equal to LwrExpression, the ScopeStatement is executed zero times. If Foreach is foreach, then the variable is set to LwrExpression, then incremented at the end of each iteration. If Foreach is foreach_reverse, then the variable is set to UprExpression, then decremented before each iteration. LwrExpression and UprExpression are each evaluated exactly once, regardless of how many times the ScopeStatement is executed. 

import std.stdio;

int foo()
{
    writefln("foo");
    return 10;
}

void main()
{
    foreach (i; 0 .. foo())
    {
	writef(i);
    }
}

Prints:

foo0123456789





。。。。
分享到:
评论

相关推荐

    HttpWatchPro-v6.014(网页数据分析工具)

    HttpWatch是一款强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网页摘要.Cookies管理.缓存管理.消息头发送/接受.字符查询.POST 数据和目录管理功能.报告输出

    Oracle.DataAccess.dll 2.112.3.0

    Oracle.DataAccess.dll 2.112.3.0

    缅甸语输入法.doc

    2. **缅甸语字库**:Myanmar3.ttf,这是用来显示缅甸文字的字体文件,必须安装到系统字体库中才能正常显示缅甸文。 3. **注册表**:Myanmar3_IE.reg,这个文件用于更新IE浏览器的注册表设置,确保浏览器能够正确显示...

    802.3标准合集

    802.3-2005_section2.pdf 802.3-2005_section3.pdf 802.3-2005_section4.pdf 802.3-2005_section5.pdf 802.3-2008 section 1.pdf 802.3-2008 section 2.pdf 802.3-2008 section 3.pdf 802.3-2008 section 4.pdf 802....

    FTDIUN2K.INI

    FTDIUN2K.INI 驱动

    EhLib 9.3 Build 9.3.014 Cracked

    Delphi 著名控件包 Ehlib,支持 RAD Studio 10.3 RIO。

    python_docx-0.8.10-py2.py3-none-any.whl

    估计这个安装包还只兼容python 2(python2 和python3差别还是挺大的,虽然现在python 3出来很久了,但是不少三方库还没有更新),因此需要自己找一个兼容的包:python_docx-0.8.6-py2.py3-none-any.whl。然后在...

    org.apache.commons.lang jar包下载(commons-lang3-3.1.jar)

    commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....

    D3.js中文版api-接口文档

    ### D3.js中文版API接口文档详解 #### 概述 D3.js是一款非常强大的JavaScript库,主要用于在网页上绘制动态的数据可视化图表。本篇将详细介绍D3.js的核心功能及API,帮助读者更好地理解和运用D3.js进行数据可视化...

    senseiv2.x

    标题 "senseiv2.x" 指的可能是金蝶KIS系列软件的一个特定版本或组件,而描述中提到的问题是在Windows家庭版上使用该软件时遇到的驱动程序兼容性问题。金蝶KIS是一款企业级的财务管理软件,主要用于中小型企业,它...

    libaio-0.3.105-2.x86_64.rpm

    libaio-0.3.105-2.x86_64.rpm libaio-devel-0.3.105-2.i386.rpm libaio-devel-0.3.105-2.x86_64.rpm libaio-devel-0.3.106-5.x86_64.rpm pdksh-5.2.14-36.el5.x86_64.rpm unixODBC-2.2.11-7.1.x86_64.rpm unixODBC-...

    nssock2.dll

    2013.3月最新nssock2.dll版本 对于xshell等软件打开错误,无法连接动态库有很好的解决 下载后,将该文件放到安装目录下 或者放到c盘的windows/System32目录下

    cef_binary_3.2623.1395.g3034273_windows32.part2

    cef_binary_3.2623.1395.g3034273_windows32

    yolov3-tiny.conv.15

    ./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15 结果

    libiconv-2.dll

    opencv libiconv-2.dll

    大漠插件3.1233全套

    2. **大漠后台系统**:这是整个插件的管理和控制中心,用户可以通过这个后台管理系统配置插件参数,监控插件运行状态,以及进行脚本编写和调试。后台系统通常会提供丰富的API接口,以便与其他程序进行交互,实现更...

    信息安全风险评估报告.pdf

    2 业务系统分析 ................................................................................................................................. 6 2.1 业务系统职能 ......................................

    hex2c.exe程序

    将HEX文件转换成TXT文本的程序.运行命令行中输入cmd命令,然后进入文件的目录,然后在输入转换命令.

    Altium.Designer.Winter.09.SP3.Build8.3.0.16776

    Altium.Designer.Winter.09.SP3 破解版,电路设计软件,protel的升级版,兼容protel文件,把 Cracked文件夹里的两个文件复制到软件的安装目录就完成破解。 还有一个最新版请看下面链接 ...

    org.apache.commons.lang jar包下载

    commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....

Global site tag (gtag.js) - Google Analytics