为什么printf和scanf不等价?

3
我有一个程序显示“hi”,但我不理解原因。 我了解scanf和printf都会返回它们读/写的字符数,但在这种情况下它是如何工作的?
void main()
{
    if(printf==scanf)
        printf("hello");
    else
        printf("hi");
}

5
你正在比较printf函数的地址和scanf函数的地址,而不是函数返回值。请注意不要改变原文意思,并将翻译语言变得更加通俗易懂。 - forsvarir
可能是因为printf和scanf不相等? - 0xAX
2
这可能会有帮助:链接 - Shash
6个回答

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


@Akina91 正如 @orlp 所提到的,不要写 void main。因为它是空的,所以调用你的程序的另一个程序不知道它是如何工作的。使用 int,另一个程序可以查看返回值。此外,int argc,char **argv 是可选的。它只是用于参数。argc 是用户在运行程序时输入的参数数量,并且这些参数存储在 argv 中。因此,在 argv 中有 argc 个元素,而 argv 中的最后一个元素是 argv [argc-1]。此外,argv 中的第一个参数是用于运行程序的命令。 - Flare Cat

3

在这里,您比较函数的地址,由于这些函数不相同,所以它们之间没有相等关系。我不清楚有什么让您感到困惑。


3
对于初学者来说,C/C++ 很容易让人感到困惑。 - nhahtdh

3
您在if语句中没有调用printf或scanf函数。相反,您正在比较内存中scanf和printf函数的位置,它们是不同的(否则,它们将运行相同的代码,并具有相同的功能)。
只有在调用函数时才会返回返回值。调用将类似于(逗号分隔的参数)。

2

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

您可以尝试以下代码以更好地理解它

int main(void)
{

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

   return 0;
}

1

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


0
只是为了补充这个问题的另一个角度。其他人已经指出如何比较地址和函数。但是这段代码也有一定意义(虽然它很牵强)。
int main()
{
    if(printf("")==scanf(""))
        printf("hello");
    else
        printf("hi");
}

这段代码保证会打印出“hello”。为什么呢?首先,我们来看一下返回值。`printf`函数将返回打印的字符数,对于空字符串来说是零。`scanf`函数将返回成功赋值的数量(而不是读取的字符数),对于空字符串也是零。如果发生了某些错误,它也可以返回EOF,尽管我认为这种情况高度不可能,即使我不能保证它不会发生。好吧,`printf`也可能失败,在这种情况下将返回一个未指定的负数。
因此,它将打印“hello”,除非`printf`和`scanf`都遇到问题,并且`printf`返回EOF,在这种情况下,它将打印“hi”。
然而,这可能是未定义行为。我不确定评估顺序是否被定义良好,或者是否重要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接