Closed jjj4me closed 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;
谢谢指教,现在明白了。
这个代码,在OCRunner里面运行,输出结果是:3.000000 正常原生代码运行,输出结果是:3.666667
猜测: 原生的逻辑是先执行参数强转,再执行表达式的计算。 OCRunner的逻辑是先执行表达式计算,再对结果进行强转?