条件规则常量

Conditional rule constant

提问人:Russell Clarke 提问时间:9/27/2020 最后编辑:bolovRussell Clarke 更新时间:9/28/2020 访问量:60

问:

我写了一个条件常量,我想告诉机器它已经知道什么来定义规则。但是,所有输出都设置为 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 布尔 条件语句 逻辑

评论

0赞 Russell Clarke 9/27/2020
忘了提我是 C 的新手。 终端输出: (pos > 零) pos ?: 零 0.000000 (零 > pos) 零 ?: pos 0.000000 (负 > pos) 负 ?: pos 0.000000 (负 > 零) 负 ?: 零 0.000000 (pos > 负) pos ?: 负 0.000000
0赞 bolov 9/27/2020
我们能不能就问候、问候等发表正式声明?

答:

2赞 Chase 9/27/2020 #1

这有很多完全错误的地方。我强烈建议在继续之前拿起一本好的 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);

所以,这就是这个宏的工作方式 - 无论它在你的代码中看到什么,(即)它都会用#defineRULERULE(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 然后,它将此结果与1pos-

1 < pos

pos是 1.0;将浮点数与整数进行比较是一个坏主意,并且可能计算为 0(即 false),这就是您的机器正在做的事情。阅读此文1 < 1.01 > 1.0

所以这就是它总是 0 的原因。你的三元被完全忽略,每个变量都得到相同计算的结果,也就是说(neg < zero < pos)

再一次,我建议阅读一本好的 C 书。教你写作的人肯定不是一个好老师,在C方面更是如此。float main