我有一个显示“hi”的程序,但我不明白为什么。
我理解scanf和printf都会返回它们读/写的字符数,但在这种情况下它是如何工作的?
void main()
{
if(printf==scanf)
printf("hello");
else
printf("hi");
}
答案 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");
}
}
由于scanf
和printf
功能不同,因此它们位于不同的地址,因此比较失败并打印hi
。
答案 1 :(得分:3)
在这里你比较函数的缺点,因为函数不相同,等式不成立。我不明白你有什么困惑。
答案 2 :(得分:3)
您没有在if语句中调用printf
或scanf
。相反,您正在比较内存中scanf
和printf
函数的位置,这些函数是不同的(否则,它们将运行相同的代码,并具有相同的功能)。
如果调用该函数,则只返回返回值。调用看起来像<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
也会失败,并且在这种情况下将返回未指定的负数。
因此,除非printf
和scanf
都遇到问题,并且printf返回EOF,它将打印“ hi”,否则它将打印“ hello”。
但是,这可能是UB。我不确定评估顺序是否定义明确,或者是否很重要。