std :: cout的意外行为

时间:2017-08-14 11:21:47

标签: c++ function-pointers

我最近玩的是函数指针,当我发现由std::cout打印的函数指针的值总是计算为1时。

然而printf()并非如此,它会打印出预期的结果。

如果有人能够解释这种行为背后的原因,那就太棒了。

以下是代码示例供参考。

#include<iostream>

using namespace std;

int  fun(int a)
{
    return 0;
}

int main()
{

    cout<<(&fun)<<endl; //always prints 1
    printf("%u",&fun); //this prints the expected result

    return 0;
}

2 个答案:

答案 0 :(得分:4)

printf调用只是未定义的行为。函数指针不是无符号整数,因此为%u参数提供它是无效的。 (尝试在64位平台上运行此代码。您将无法获得正确的函数指针值。)

另一方面,cout是类型安全的。编译器看到一个函数指针参数,并尝试找到它可以的最佳打印函数(operator<<重载)。函数指针本身没有这样的重载,并且指针不提供大量的隐式转换。只有一个重载可以工作,那就是bool的重载。因此编译器将非NULL函数指针转换为true并传递它。然后重载将其打印为1,但您可以使用std::boolalpha修饰符将其打印为true

答案 1 :(得分:1)

您的cout(&fun)视为布尔表达式,并警告它将始终评估为true(即非零)。

尝试将其转换为void*,因为地址应该打印,并检查会发生什么:

#include <iostream>
#include <stdio.h>
using namespace std;

int  fun(int a){
    return 0;
}

int main(){

    cout<<(void*)(&fun)<<endl; //always prints 1

    /* Side note: This will print the same as above */
    // cout<<(void*)(fun)<<endl;  // note the missing &

    printf("%p",(void*)&fun); //this prints the expected result
    // while(1);
    return 0;
}
mu机器上输出

0x401460
0x401460