C 在两个连续if语句下面使用的重复整数if传递变量

C 在两个连续if语句下面使用的重复整数if传递变量,c,C,我真的不知道如何命名,但在下面的代码段中,当我将一个数字传递到sad()中时,它应该将tmp1更改为该数字,输出该数字,然后退出。然后在main()中的下一次迭代中,sad()中的tmp2应该输出该数字tmp3将等于10*tmp1+tmp2,这将两个数字合并在一起。上面输出的两个数字都很好,但是当它到达第二个if语句之后,它会重复这些数字。例如,如果我使tmp3=tmp1,它将重复3六次。你如何使它不再重复 #include <stdio.h> #include <string

我真的不知道如何命名,但在下面的代码段中,当我将一个数字传递到
sad()
中时,它应该将
tmp1
更改为该数字,输出该数字,然后退出。然后在
main()
中的下一次迭代中,
sad()
中的
tmp2
应该输出该数字
tmp3
将等于
10*tmp1+tmp2
,这将两个数字合并在一起。上面输出的两个数字都很好,但是当它到达第二个
if
语句之后,它会重复这些数字。例如,如果我使
tmp3=tmp1
,它将重复
3
六次。你如何使它不再重复

#include <stdio.h>
#include <string.h>
char tmp1 = 'a';
char tmp2 = 'a';
char tmp3 = 'a';
char sad(char a)
{       
        //int same as char, char not same as int
        //tmp3 eventually equals tmp1   
        if (tmp1 == 'a') //if number skip
        {
                tmp1 = a;
                printf("tmp1 %d\n", tmp1);
                return 0;
        }
        if (tmp2 == 'a') //if number skip
        {
                tmp2 = a;
                printf("tmp2 %d\n", tmp2);
        }
        tmp3 = 10 * tmp1 + tmp2;
        printf("%d", tmp1); 
        return 0;


}
int main()
{
        int tmpnum[8] = {3, 2, 123, 342, 23, 32, 0, 12};
        int i;  
        for (i = 0; i < sizeof(tmpnum) / sizeof(tmpnum[0]); i++)
        {
                sad(tmpnum[i]);
        }       
}
#包括
#包括
char tmp1='a';
char tmp2='a';
字符tmp3='a';
查萨德(查a)
{       
//int与char相同,char与int不相同
//tmp3最终等于tmp1
if(tmp1='a')//如果数字跳过
{
tmp1=a;
printf(“tmp1%d\n”,tmp1);
返回0;
}
if(tmp2='a')//如果数字跳过
{
tmp2=a;
printf(“tmp2%d\n”,tmp2);
}
tmp3=10*tmp1+tmp2;
printf(“%d”,tmp1);
返回0;
}
int main()
{
int tmpnum[8]={3,2,123,342,23,32,0,12};
int i;
对于(i=0;i
您只需在第二个if中返回,并在后续段落中重置初始值:

char sad(char a)
{       
    static char tmp1 = 'a';
    static char tmp2 = 'a';
    static char tmp3 = 'a';

    //int same as char, char not same as int
    //tmp3 eventually equals tmp1   
    if (tmp1 == 'a') //if number skip
    {
        tmp1 = a;
        printf("tmp1 %d\n", tmp1);
        return 0;
    }
    if (tmp2 == 'a') //if number skip
    {
        tmp2 = a;
        printf("tmp2 %d\n", tmp2);
        return 0;
    }
    tmp3 = 10 * tmp1 + tmp2;
    printf("%d", tmp3); // this should be tmp3 not tmp1, right?
    tmp1 = 'a';
    tmp2 = 'a';
    return 0;
}
您可以使用与tmp变量分离的状态变量使逻辑更加明显

char sad(char a)
{       
    static char tmp1 = 'a';
    static char tmp2 = 'a';
    char tmp3;
    static state=0;

    switch(state)
    {
    case 0:
        tmp1 = a;
        printf("tmp1 %d\n", tmp1);
        state = 1;
        return 0;

    case 1:
        tmp2 = a;
        printf("tmp2 %d\n", tmp2);
        state = 2;
        return 0;

    case 2:
        tmp3 = 10 * tmp1 + tmp2;
        printf("%d", tmp3); // this should be tmp3 not tmp1, right?
        state = 0;
        return 0;
    }
}

我没有答案,但我有一个解决办法。我可以用main而不是sad打印tmp3。我认为这是因为调用所有变量的for循环正在到达该点,并且只执行tmp3的打印。

不要使用全局变量,而局部(自动)变量也可以。使用调试器查看代码并查看值。它们不会这样做,因为每次调用函数时,值都将等于“a”,我不能这样做。因为我需要它们保留数字,直到另行通知。我不确定预期的输出应该是什么。在对
sad()
的前两次调用之后,
tmp1
tmp2
被设置为非
'a'
,因此如果跳过前两次
,则不会重置
tmp1
tmp2
,因此
tmp3
将始终获得相同的值,并且您正在此处打印
tmp1
的值。报告的输出与预期一致。