提问人:Russell Clarke 提问时间:9/27/2020 最后编辑:bolovRussell Clarke 更新时间:9/28/2020 访问量:60
条件规则常量
Conditional rule constant
问:
我写了一个条件常量,我想告诉机器它已经知道什么来定义规则。但是,所有输出都设置为 0.0000 浮点。这不是问题,问题是,我期望在某些情况下是 1 或 -1。
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <math.h>
float zero = 0.0;
float pos = 1.0;
float neg = -1.0;
float RULE;
float x, y, z;
//#define RULE (neg < zero < pos);
float main() {
#define RULE (neg < zero < pos);
float a, b, c, d, e;
a = RULE(pos > zero) ? pos : zero;
b = RULE(zero > pos) ? zero : pos;
c = RULE(neg > pos) ? neg : pos;
d = RULE(neg > zero) ? neg : zero;
e = RULE(pos > neg) ? pos : neg;
printf("(pos > zero) pos ?: zero %f \n", a);
printf("(zero > pos) zero ?: pos %f \n", b);
printf("(neg > pos) neg ?: pos %f \n", c);
printf("(neg > zero) neg ?: zero %f \n", d);
printf("(pos > neg) pos ?: neg %f \n", e);
return 0;
}
答:
这有很多完全错误的地方。我强烈建议在继续之前拿起一本好的 C 书。检查此线程以获取好的 C 书籍。
现在,解释一下出了什么问题。老实说,我不知道你想做什么,所以我只会解释你做错了什么,以及你所看到的行为背后的原因。
首先,不是 main 函数的有效签名。根据 C 标准,该函数必须返回整数。float main()
main
5.1.2.2.1
程序启动
程序启动时调用的函数名为 main。该实现没有声明此函数的原型。它应使用返回类型 int 定义,并且不带参数:
int main(void) { /* ... */ }
或具有两个参数(此处称为 argc 和 argv,尽管可以使用任何名称,因为它们 是声明它们的函数的本地函数):
int main(int argc, char *argv[]) { /* ... */ }
或同等学历;10)或以其他实现定义的方式。
所以一定要把它改成第一。(也有效,但它们实际上并不相同)int main(void)
int main()
现在,这个宏
#define RULE (neg < zero < pos);
所以,这就是这个宏的工作方式 - 无论它在你的代码中看到什么,(即)它都会用#define
RULE
RULE(pos > zero) ? pos : zero;
(neg < zero < pos);
所以,当你写——
a = RULE(pos > zero) ? pos : zero;
它变成了,
a = (neg < zero < pos);(pos > zero) ? pos : zero;
这与-
a = (neg < zero < pos);
(pos > zero) ? pos : zero;
是的。。。。。这毫无意义......完全。每个变量都只是存储了 的结果,而三元 () 被完全忽略,因为结果不存储在任何地方。(neg < zero < pos)
(pos > zero) ? pos : zero;
请仔细研究工作原理,这并不难 - 相信我:)。这是 cppref 的一个很好的指南#define
但是等等!还有更多 - < - 这并没有做你可能认为它做的事情。
这只是被分组为-(neg < zero < pos)
(neg < zero) < pos
所以这首先评估——
neg < zero
这显然是(又名真实),因为确实,-1.0 小于 0.0
然后,它将此结果与1
pos
-
1 < pos
pos
是 1.0;将浮点数与整数进行比较是一个坏主意,并且可能计算为 0(即 false),这就是您的机器正在做的事情。阅读此文1 < 1.0
1 > 1.0
所以这就是它总是 0 的原因。你的三元被完全忽略,每个变量都得到相同计算的结果,也就是说(neg < zero < pos)
再一次,我建议阅读一本好的 C 书。教你写作的人肯定不是一个好老师,在C方面更是如此。float main
评论