C 函数中的参数;不同结果

C 函数中的参数;不同结果,c,C,我刚开始参加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'); re

我刚开始参加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", OutputF(InputF(), InputF()));
    printf("%d", OutputF('Y', 'N'));
    return 0;
}
假设OutputFInputF,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;
}

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

原因是调用函数Input printf%d、OutputFInputF、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。

您得到的意外输出是什么?不编译