gpt4 book ai didi

delphi - 为什么串联字符串函数会使结果顺序错误?

转载 作者:行者123 更新时间:2023-12-03 18:58:58 24 4
gpt4 key购买 nike

我正在使用类似的东西来定义一个SQL插入命令:

sql := 'insert into table(a, b, c) values (' + formatfunction(a) + ', ' + 
formatfunction(b) + ', ' +
formatfunction(c) + ');';


分配后,变量sql以不同顺序包含a,b,c的格式化值,结果如下所示:

insert into (a, b, c) values ​​('value in c', 'value in a', 'value in b');


编译器优化可能存在一些问题?

很抱歉,示例代码不完整,完整的可执行代码如下:

procedure Execute(var v : String);
function ExtractValue(var Content: String; Separator: Char = '|'): String;
var
vpHead,
vpTail,
vpContent: PChar;
vsValor: String;
begin
vpContent := PChar(Content);
Result := '';
if (vpContent = nil) or
(vpContent^=#0) then
Exit;
vpTail := vpContent;
vpHead := vpTail;

while not (CharInSet(vpTail^, [Separator]) or (vpTail^=#0)) do
vpTail := StrNextChar(vpTail);

if (vpHead^ <> #0) then
begin
if (vpHead <> vpTail) then
begin
SetString(vsValor, vpHead, vpTail - vpHead);
Result := vsValor;
end
else
Result := '';
end;

Content := Copy(Content, Length(vsValor) + 2, (Length(Content) - Length(vsValor)) + 1);
end;

function FormatAsDate(const s: String): TDate;
begin
Result := 0;

if Trim(s) <> '' then
Result := StrToDateDef(Copy(s, 1, 2) + '/' + Copy(s, 3, 2) + '/' + Copy(s, 5, 4), 0);
end;

function AsCurrency(const s: string): Double;
begin
Result := StrToFloatDef(s, 0);
end;

function AsDate(const s: string): string;
var
d: TDate;
begin
d := FormatAsDate(s);

if d = 0 then
Result := QuotedStr('null')
else
Result := QuotedStr(FormatDateTime('yyyy/mm/dd', d));
end;

function AsText(const s: string): string;
begin
Result := QuotedStr(s);
end;
begin
v :=
'INSERT INTO TABLE (A, B, C, D, E, F, G, H, I, J, K, L, M) VALUES (' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsDate(ExtractValue(v)) + ', ' +
AsDate(ExtractValue(v)) + ', ' +
StringReplace(FloatToStr(AsCurrency(ExtractValue(v))), ',', '.', []) + ', ' +
StringReplace(FloatToStr(AsCurrency(ExtractValue(v))), ',', '.', []) + ', ' +
AsText(ExtractValue(v)) + ', ' +
StringReplace(FloatToStr(AsCurrency(ExtractValue(v))), ',', '.', []) + ', ' +
StringReplace(FloatToStr(AsCurrency(ExtractValue(v))), ',', '.', []) + ');';
end;


使用输入字符串'04368898000106 | 06 | 00 ||| 3413572 | 26102011 | 31102011 | 1656,81 | 334,57 || 0,00 | 0,00',插入命令的值是不同的顺序比输入字符串中显示的要多

最佳答案

您的代码取决于表达式中操作数的求值顺序。该评估顺序未定义。

考虑一个简单的情况,请考虑以下代码:

x := f1(a) + f2(b);


无法保证函数调用 f1()f2()的执行顺序。您大概希望 f1()f2()之前执行,但是编译器不保证这样做,实际上,我相信这些操作数通常会从右到左求值。

在您的代码中,表达式中的操作数包含一个函数调用 ExtractValue(),该函数具有修改其参数的副作用。由于表达式中的操作数不是从左到右求值的,因此 ExtractValue()的调用不会按照它们在表达式中出现的顺序发生。并且,由于 ExtractValue()具有影响表达式其余部分的副作用,因此结果取决于评估顺序。

您将需要重新编写此代码,以便对 ExtractValue()的调用在单独的语句中发生。

关于delphi - 为什么串联字符串函数会使结果顺序错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com