![]() |
1
12
表达式的求值顺序通常是
您的原始代码可能不是您想要的,即使求值顺序不同。即使
不管怎样,改变数学.pas也帮不了你。它不控制实际参数的求值顺序。当它看到它们时,它们已经被计算成一个布尔值和一个整数;它们不再是可执行表达式了。 调用约定可以影响求值顺序,但仍不能保证。将参数推送到堆栈上的顺序不需要与确定这些值的顺序匹配。实际上,如果您发现stdcall或cdecl提供了所需的求值顺序(从左到右),那么它们将在 倒序 和他们擦肩而过的那个。
这个
帕斯卡
调用约定在堆栈上从左到右传递参数。这意味着最左边的参数位于堆栈的底部,最右边的参数位于顶部,就在返回地址的下面。如果
注意
默认的寄存器调用约定也从左到右传递参数,但适合的前三个参数在寄存器中传递。不过,用于传递参数的寄存器也是最常用于计算中间表达式的寄存器。结果
|
![]() |
2
3
这个
calling convention
影响评估它们的方式。
虽然我个人永远不会依赖这种行为。 下面的示例程序演示了这是如何工作的。
如果你真的希望这是一个一行,你真的可以这样做,在德尔福。我只是觉得很难看。
|
![]() |
3
1
就像:
|
![]() |
4
0
AFAIK没有编译器指令来控制它。除非使用stdcall/cdecl/safecall约定,否则参数将在堆栈上从左到右传递,但由于默认寄存器约定也可以在寄存器中传递参数,因此可能会在稍后计算参数,并在调用之前放入寄存器。因为只有寄存器顺序是固定的(EAX,EDX,ECX),所以寄存器可以按任何顺序加载。您可以尝试强制执行“pascal”调用约定(无论如何,您需要重写函数),但是如果编译器不能明确地保证求值顺序,那么依赖这种代码总是很危险的。而强制执行求值顺序可能会大大减少可用的优化数量。 |
![]() |
Some1Else · 函数在Delphi中重新创建TForm 2 年前 |
![]() |
Agmcz · Delphi安卓库。so未安装(AAB) 2 年前 |
![]() |
nader · 如何使用delphi在web上提交表单 6 年前 |
![]() |
kwadratens · Delphi中的卡方分布函数代码 6 年前 |
|
user9672569 · 如何在完整的位图图像中绘制阴影效果? 6 年前 |
![]() |
mmmm · MSBuild(用于Delphi)Make-like功能 6 年前 |