功能参数;不同的结果

我刚刚开始参加C基础课程。今天我遇到了这个问题。

为什么用“ OutputF()”函数输入Y和N会导致直接传递Y和N产生不同的结果?

printf("%d",OutputF(InputF(),InputF()));
printf("%d",OutputF('Y','N'));

这是整个代码:

#include<stdio.h>

char InputF(void) {
    char a = getchar();
    while (getchar() != '\n');
    return a;
}

int OutputF(char Input1,char Input2) {
    if (Input1 == 'y' || Input1 == 'Y')
        if (Input2 == 'y' || Input2 == 'Y')
            return 200;
        else
            return 300;
    else
        if (Input2 == 'y' || Input2 == 'Y')
            return 400;
        else
            return 500;
}


int main(void)
{
    printf("%d",InputF()));
    printf("%d",'N'));
    return 0;
}
hyjdbsc 回答:功能参数;不同的结果

您假设OutputF(InputF(),InputF())正在按照函数调用参数中声明的顺序调用InputF()。那是C语言中未定义的行为。 根据C规范:

  

功能指示符的评估顺序,实际   参数,而实际参数中的子表达式是   未指定,但实际调用之前有一个序列点。

编译器可以执行任何所需的操作。尝试以下方法:

int main(void)
{
    char in1 = InputF();
    char in2 = InputF();

    printf("%d\n",OutputF(in1,in2));
    printf("%d\n",OutputF('Y','N'));
    return 0;
}

有关未定义行为的详细信息,请参见此link

,

原因是当您调用函数Input(printf(“%d”,OutputF(InputF(),InputF()));)时,您可以在调试器中看到Input1将为'Y',而Input2将为是“ N”。在您第二次调用时相反,第二次调用的原因是400,第二次是300。

第一次通话(首先输入“ Y”,然后输入“ N”)

    Input1  78 'N'  char
    Input2  89 'Y'  char

输出为400。

第二次呼叫:

    Input1  89 'Y'  char
    Input2  78 'N'  char

输出为300。

本文链接:https://www.f2er.com/3164542.html

大家都在问