Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 定义常量操作而不在编译时解析它_Optimization_Compiler Construction_C Preprocessor_Operation - Fatal编程技术网

Optimization 定义常量操作而不在编译时解析它

Optimization 定义常量操作而不在编译时解析它,optimization,compiler-construction,c-preprocessor,operation,Optimization,Compiler Construction,C Preprocessor,Operation,我的C代码中有以下指令: #定义比例尺156/10 它用于乘以传感器的值。 因为我只处理整数,所以操作是 结果=传感器*刻度 因此,如果传感器读数为10,则正确结果为156。但编译器正在解析它,结果值为150。是否有任何指令告诉编译器不要选择这个特定的#define?这里有问题。正如您所写的,该行应该扩展为result=sensor*156/10,并且*和//code>从左到右关联,因此当sensor==10时,它将被评估为result=(sensor*156)/10,等于156。这不是一个好的

我的C代码中有以下指令:

#定义比例尺156/10

它用于乘以传感器的值。 因为我只处理整数,所以操作是

结果=传感器*刻度


因此,如果传感器读数为10,则正确结果为156。但编译器正在解析它,结果值为150。是否有任何指令告诉编译器不要选择这个特定的#define?

这里有问题。正如您所写的,该行应该扩展为
result=sensor*156/10
,并且
*
//code>从左到右关联,因此当
sensor==10
时,它将被评估为
result=(sensor*156)/10
,等于
156
。这不是一个好的做法,但在这种特殊情况下,它应该做你想做的。你确定你发布的是你程序中的代码吗?或者你可能有
#define SCALE(156/10)
来代替吗?依赖运算符优先级是一种很糟糕的方法,因为在编写时,你会得到156,但是如果你将它改为
result=SCALE*sensor
你会得到150,这使得乘法似乎不会进行转换。更好的方法是使用参数重写宏并强制执行操作顺序,如
#define SCALE_VALUE(x)((x)*156)/10)
。或者更好的方法是使用内联函数,不管怎样,这些都与编译器优化无关(除非你的编译器被严重破坏);这完全是关于运算符优先级和整数除法截断的事实。如果计算是在运行时完成的,则会得到相同的结果,只是效率较低。