【问题标题】:Writing a function to check if a relational statement is true or false [closed]编写一个函数来检查关系语句是真还是假[关闭]
【发布时间】:2013-03-17 02:03:12
【问题描述】:

这是函数(我希望逻辑相当明显)。

设 x 为 '' 运算符之一 a 和 b 是术语。

int rationalCheck(x, a, b){

    if ( x == '<' && a < b && b < a ){
        printf( "a is less than b\n" );
    }

    if ( x != '>' && a > b && b > a ){
        printf( " a is greater than b\n" );
    }

    return 0;
}

函数的输入是

(4 < 4) > (3 > 3)

这将评估为

(4 < 4) > (3 > 3) is false

或者函数的输入是

(4 < 6) > (2 > 1)

这将评估为

(4 < 6) > (2 > 1) is true

【问题讨论】:

  • 你发现什么是你的问题?
  • 请注意,在 CC++ 中,您有 false &lt; true
  • a &lt; b &amp;&amp; b &lt; a 是假的,a &gt; b &amp;&amp; b &gt; a 也是假的
  • 你的函数只比较两个数字(数字?参数类型在哪里?)——你想要一个成熟的表达式解析器吗?
  • 请注意,在 C 中,表达式 (4 &lt; 6) &gt; (2 &gt; 1) 的计算结果为 0(假)。 4 &lt; 6 为真,因此其值为 1; 2 &gt; 1 为真,计算结果为 1;因此,中间运算符正在评估 1 &gt; 1,它是 false 并且评估为 0。

标签: c function logic rational-number


【解决方案1】:

您不能将运算符/操作传递给 C 中的函数。我建议考虑使用 Haskell。

或者,您可以将操作传递给,因此可以将其实现为宏,因此assert 宏的定义类似于:

#include <stdio.h>

#define assert(cond) if (!(cond) && printf("Assertion failed: " # cond " at " __FILE__ ":%d\n", __LINE__) != 0) abort()

int main(void) {
    assert(1 > 1);
}

也许你想要类似的东西:

#include <stdio.h>

#define rational_check(cond) printf(# cond " is %s\n", (cond) == 0 ? "false" : "true")

int main(void) {
    rational_check((4 > 4) > (3 > 3));
    rational_check((4 < 6) > (2 > 1)); // (4 < 6) > (2 > 1) is 1 > 1, by the way... false
}

但是,我不能确定这是否适合您的需求。函数指针不能从rational_check 派生,也不能用于表示运行时形成的表达式的字符串;您需要为任何需要这些的用例编写翻译器......否则,这应该是合适的。

【讨论】:

    【解决方案2】:

    这对我有用。我想多了。

    int rationalCheck(x, a, b){
    
    
    if ( x == '<')
    {
        if (a >= b)
        {
            return 99;
        }
    
        if (b <= a) {
            return 99;
        }
    }
    
    if (x == '>')
    {
        if (a <= b)
        {
            return 99;
    
        }
        if (b >= a)
        {
            return 99;
        }
    
    }
    
    
    return 1;
    }
    

    感谢大家的意见。

    【讨论】:

    • 请至少学会用C89写作。像这样编写的完全没有参数类型的函数已经过时了,令人震惊。这样的代码在工业中是不可接受的。在最初的 C 标准发布之前,这几乎是无法容忍的;这在现代 C 中肯定是不可接受的。
    • 你认为你的第二个return 99;会在什么情况下被执行?没有我能想到的!与第四个类似。
    • @JonathanLeffler 愿意在这里学习。您能否提供代码示例的反馈?
    • @JonathanLeffler 也感谢您指出第二次返回永远不会运行! \
    • 函数应该使用参数类型(原型符号)定义,例如:int rationalCheck(char x, int a, int b) { ... }。您使用的隐式 int 表示法不是标准 C99 的一部分(尽管编译器仍然可以识别它,通常会生成警告)。您没有使用 Turbo C 是吗?如果您使用的是 GCC,则使用 -Wall 选项是一个很好的起点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2020-11-16
    • 2019-01-21
    • 2019-08-09
    • 2019-12-24
    相关资源
    最近更新 更多