为什么GCC在赋值表达式时从表达式中减去1 ?

why does gcc subtract 1 from an expression while assigning the expression?

本文关键字:表达式 GCC 赋值 为什么      更新时间:2023-10-16

在解决问题时使用code::阻塞IDE和c++,表达式像result[i] += ((res*1.0 /10)-(res/10)) * 10;,如果对result[i]赋值后,右表达式的结果是8,它就变成了7,所以result[i]保存的是7而不是8。

下面是整个函数:它取两个数字,并将它们分别转换成一个数组。例如,34变成{4,3},所以我将数字作为数组添加,而不是作为普通数字。

void add(char a, char b)
    {
        //get # digits of both
        int n1=0;
        int n2=0;
        char temp1=a;
        char temp2=b;
        //counting # digits of first number
        while( (temp1*1.0/10) != 0 )
        {
            n1++;
            temp1/=10;
        }
        //counting # digits of second number
        while( (temp2*1.0/10) != 0 )
        {
            n2++;
            temp2/=10;
        }
        int maxi=max(n1,n2);
        int mini=min(n1,n2);
        //filling arr1 arr2
        char * arr1=new char[n1];
        char * arr2=new char[n2];
        char * result=new char[maxi+1];
        //fill result with zeros
        for(int k=0; k<maxi+1; k++)
            result[k]=0;
        temp1=a;
        for(int i=0; i<n1; i++)
        {
            arr1[i]=((temp1*1.0 /10)-(temp1/10)) * 10;
            temp1/=10;
        }
        temp2=b;
        for(int j=0; j<n2; j++)
        {
            arr2[j]=((temp2*1.0 /10)-(temp2/10)) * 10;
            temp2/=10;
        }

        //add both arrays
        char res=0;
        char overflow=0;
        for(int i=0; i<maxi; i++)
        {
            if(i<mini)
            {
                res=arr1[i]+arr2[i];
                if(checkDigit(res))
                {
                    result[i]=res;
                }
                else
                {
////////////////////////////
//>>>>>>>>            result[i] += ((res*1.0 /10)-(res/10)) * 10;
///////////////////////////
                    overflow=res/10;
                    result[i+1]=overflow;

                }
            }
            else
            {
                if(n1<n2)
                {
                    result[i]+=arr2[i];
                }
                else if(n2<n1)
                {
                    result[i]+=arr1[i];
                }
            }



        }
        if(!checkDigit(result[maxi-1]))
        {
            // assign overflow before
            result[maxi]=result[maxi-1]/10;
            result[maxi-1]=((result[maxi-1]*1.0 /10)-(result[maxi-1]/10)) * 10;
        }


        for(int i=0; i<maxi+1; i++)
            cout<<(int)result[i]<<endl;


    }
 之前

您正在进行浮点运算。计算机上的浮点运算不是特别精确。至少不适合base10。可能发生的情况是,您的结果类似于7.9999999999991。标准库中的各种文本流将把它打印为8,但事实并非如此。然后,当你给result[i]赋值时,它是一个char类型——一个整型——你会从编译器得到标准的"截断。之后的所有内容"的响应。

对此的简单响应是一个舍入操作。在结果上加0.5,然后转换成一个积分。根据你想要解决的问题,有多种解决方案。

您正在使用浮点数学,这将引入舍入误差,然后您还将它们转换为截断的整数(可能是您在程序中想要的)。

经验法则:不要期望浮点数学的精确结果。这些细节可以填满一学期或更长时间的课程。

对于你的程序,你应该知道余数运算,我认为它正是你想要做的:

arr1[i]=temp1 %= 10;
temp1 / =10;