SilverFruity / OCRunner

Execute Objective-C code as script. AST Interpreter. iOS hotfix SDK.
MIT License
660 stars 149 forks source link

有强转的计算表达式,计算结果错误 #32

Closed jjj4me closed 1 year ago

jjj4me commented 1 year ago

截屏2023-05-27 10 59 46

这个代码,在OCRunner里面运行,输出结果是:3.000000 正常原生代码运行,输出结果是:3.666667

猜测: 原生的逻辑是先执行参数强转,再执行表达式的计算。 OCRunner的逻辑是先执行表达式计算,再对结果进行强转?

SilverFruity commented 1 year ago

在 OCRunner 中只是支持了类型强转的语法,但在实际运行中是不支持类型强转的,生成语法树时没有保存它。 运行过程中,单个变量的实际类型是根据其声明时的类型来确定的(C 的强转操作在 OCRunner 中是无用的)。 上述代码,OCRunner 中运行时的逻辑如下:

int a = 11;
int b = 3;
int c = a /  b;
double value = (c 转换为 double 类型);

同时值得一提的是,在 OCRunner 的 / 运算符实现中,左右两值只要有一个是 double 类型的,就会将两个值都作为 double 进行运算。 如果想在 OCRunner 中做到类型转换,可以声明一个新的变量来触发转换操作:OCRunner 中 assign 的时候会触发转换,右值会根据左值的类型做出转换,比如 'int a = 1; double b = a;' 这种情况下,a 会根据 b 的类型做出相应的类型转换。 你提供的代码可以修改为

double value = 11.0 / 3;
double value = 11 / 3.0;
或者
double a = 11;
doube value = a / 3;
jjj4me commented 1 year ago

谢谢指教,现在明白了。