为什么printf不等同于scanf?

时间:2012-05-29 11:57:39

标签: c

我有一个显示“hi”的程序,但我不明白为什么。

我理解scanf和printf都会返回它们读/写的字符数,但在这种情况下它是如何工作的?

void main()
{
    if(printf==scanf)
        printf("hello");
    else
        printf("hi");
}

6 个答案:

答案 0 :(得分:13)

你没有调用函数并比较结果,你比较函数本身,归结为比较函数的地址(函数名称将在许多上下文中转换为函数指针,这是一个)。你写的内容与此相同:

/* this is the correct signature for main by the way, not `void main()` */
int main(int argc, char **argv) {
    /* compare the address of printf to that of scanf */
    if (&printf == &scanf) {
        printf("hello");
    } else {
        printf("hi");
    }
}

由于scanfprintf功能不同,因此它们位于不同的地址,因此比较失败并打印hi

答案 1 :(得分:3)

在这里你比较函数的缺点,因为函数不相同,等式不成立。我不明白你有什么困惑。

答案 2 :(得分:3)

您没有在if语句中调用printfscanf。相反,您正在比较内存中scanfprintf函数的位置,这些函数是不同的(否则,它们将运行相同的代码,并具有相同的功能)。

如果调用该函数,则只返回返回值。调用看起来像<function_name> ( <arguments separated by commas> )

答案 3 :(得分:2)

正如其他人已经提到的那样,你正在比较两个函数的地址(在这种情况下是printf和scanf),并且由于这些函数不能具有相同的地址,因此比较失败使程序打印为“hi”。

您可以尝试使用以下代码来更好地理解

int main(void)
{

   printf("printf = %x\n", printf);
   printf("scanf = %x\n", scanf);

   return 0;
}

答案 4 :(得分:1)

因为函数printf的地址与函数scanf不同。

答案 5 :(得分:0)

只需在此问题上增加一个角度即可。其他人已经指出如何将地址与功能进行比较。但是这段代码有意义(嗯,这是很遥远的):

int main()
{
    if(printf("")==scanf(""))
        printf("hello");
    else
        printf("hi");
}

保证该代码可以打印“ hello”。为什么?好吧,让我们先来看一下返回值。 printf将返回打印的字符数,对于空字符串为零。 scanf将返回成功分配的数目(而不是读取的字符数),对于空字符串,该数目也为零。好吧,如果发生某些错误,它也可以返回EOF,即使我不能保证不会发生这种情况,我也不太可能。好吧,printf也会失败,并且在这种情况下将返回未指定的负数。

因此,除非printfscanf都遇到问题,并且printf返回EOF,它将打印“ hi”,否则它将打印“ hello”。

但是,这可能是UB。我不确定评估顺序是否定义明确,或者是否很重要。