Free Pascal按引用传值代码结果不符预期问题咨询
Free Pascal代码执行结果异常分析
原因解释
你遇到的情况是因为Free Pascal的表达式求值顺序是从右到左。在语句 z := z + alpha(z); 中,执行流程如下:
- 优先执行右侧的函数调用
alpha(z)——由于参数是按引用传递(var修饰),函数内部直接修改了外部变量z的值为7,同时函数返回5。 - 此时外部的
z已经变成7,接下来执行加法运算:7 + 5 = 12,最后将结果赋值给z,所以最终输出12,而非你预期的5。
修正方案
如果要得到预期的5,需要先保存z的初始值,再调用函数,避免函数修改变量影响加法运算。修改后的代码如下:
program callByRef; var z, temp: integer; function alpha(var z: integer): integer; begin z:= 7; alpha:= 5; end; begin z:= 0; temp := z; // 保存初始值0 z:= temp + alpha(z); // 用保存的值参与运算 writeln(z); readln; end.
额外说明
多数编程语言并没有强制规定表达式的求值顺序,不同编译器可能有不同的实现逻辑。Free Pascal采用从右到左的求值顺序,这是它的特定行为,编写代码时需要注意这类细节,避免依赖未定义的求值顺序。
内容的提问来源于stack exchange,提问作者milvus1962
相关产品推荐
相关产品推荐

