以下程序显示双精度表达式结果。

int main()
{
double a=5,b=10, sum; //I have to declare the types as double so I get the result in double, What I want is some way to get a floating sum when floats are added and int when ints are added (like expect 5+10 to be 15 not 15.00000)

sum = a+b;

printf("the sum is %lf \n", sum);

return 0;
}
// the sum is 15.000000


如何在不显式定义整数,浮点或双精度类型的情况下对其进行修改以实现如下所示的效果?

编辑
实际上,我将expression的值保存在堆栈中。因此,当前我使用的是double类型,因此表达式的结果为double类型,例如2 + 2将为4.0,但我希望将其作为纯int 2,而如果我的表达式结果为float,则在其中情况下我只想看到像4.2 + 1 = 5.2这样的浮动结果

我期待一些带有联合的逻辑和一些typedef类型,在这些类型中,我可以将int定义为1并将float定义为2,然后检查当时表达式的结果是否为float,如果表达式结果为,则将结果类型设置为float我将类型设置为int

// 5+5 = 10
// 5.0+3.8 = 8.8


这是我的代码,在这里我从用户那里获取输入,并检查字符是否为数字(如果是),然后检查其是否为浮点数。现在我正在使用双精度数字(yylval)来使表达式与用户的浮动输入一起工作,但我想要的是拥有一些并集或某种可以检查输入表达式是否具有浮点数的东西,那么答案应该是浮点数否则,仅对于整数,它应该具有整数结果。我还没有在这里添加表达式计算器代码。

更新的代码语法

while (ch==' '||ch=='\t'||ch=='\n') ch=getchar();

if (isdigit(ch)) {
    do {
        yytext[i]=ch;
        yylval=atoi(yytext);
        num = num * 10;
        num = num + yylval - '\0';

        ch=getchar();
    } while (isdigit(ch));
    yytext[i]=0;

if (ch == '.')
{
    ch=getchar();
    double weight;
    weight =1;
    while (isdigit(ch))
    {
        weight = weight / 10;
        double scaled;
        yytext[i]=ch;
        yylval=atoi(yytext);

        scaled = yylval  * weight;
        printf("scaled value in loop is %lf\n", scaled);
        num = num + scaled;
        ch=getchar();
    }
    yytext[i]=0;
}
yylval = num;

return(NUMBER);
}

最佳答案

我自己的类型,可以在运行时评估表达式的类型


如果您猜中了我的意思,那么您想在C代码中拥有自己的解释器(对于某些领域特定的语言)(因为您想到的是在运行时评估的表达式)。为此,您应该学习基本的编译器和解释器概念(因此,请阅读Dragon Book和Scott的Programming Language Pragmatics),学习parsing技术,设计自己的脚本语言并在程序中明确表示其abstract syntax tree

至少,我建议以某种EBNF表示法指定输入语言(您的“表达式”)。 recursive descent parser上的Wikipage包含一个很好的示例(和C程序)。

但是设计和实现您自己的解释器需要花费大量时间和精力(恕我直言,这很有趣)。您是否考虑过在自己的程序中嵌入一些现有的解释器,例如GuileLua

也许您只想要简单的算术表达式(不带变量)。这是经典的解析练习,甚至是bison中的example(解析器生成器,不正确地称为编译器编译器)。




  我期待与工会和一些typedef类型一些逻辑


也许您想将值(甚至表达式)表示为某种变量类型,即某些tagged union(或求和类型;另请参见this示例)。那么Glib's GVariant可能是有用的,或者至少是鼓舞人心的。由于Glib是free software(Lua或Guile也是),因此您可以研究其源代码。

如果您关心以不同的方式处理1+23.5+2.5,则可能需要一些type system。这是阅读更多有关解释器,编译器,编程语言(甚至可能是Pierce的Types and programming languages)的另一个原因。

如果您需要快速的功能强大(但设计合理的功能!),则应在程序中嵌入一些现有的解释器。特别是,您可能还希望在“表达式”中包含一些变量和某些函数(然后您的内容可能会变成Turing-complete)。

关于c - 如何基于C中的数据类型显示表达式的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52577302/

10-14 18:27
查看更多