Code Bye

在c/c++中如何理解,函数也是种数据类型

如题:在c/c++中如何理解,函数也是种数据类型

5分
在c/c++中,函数就不是一种数据类型,它属于二等公民。如果是一等公民就不用搞出函数指针了,c++也不用添加Lambd概念了。
5分
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

5分
简化版:
对于C来说,“类型”意味着可以声明该类型的变量,变量有地址,有内容,可以做操作。
比如int是种类型,可以声明该类型变量a,如int a = 0;
a有地址:&a;
a有内容:0;
可以对a做操作:a + 1;

函数类似,不过诚如LS某位所讲,函数不是first class的,所以某些概念需用指针来表达:
typedef void (*func)();
可以近似认为func为函数类型
可以声明变量:
void foo() {}
func a = foo;
a有地址:&a;
a有内容:foo;
a可操作:a();;

个人认为“类型”最重要的特征就是“有操作”(某种意义上来说就是OO中的method)。

5分
冯·诺依曼体系。
仅供参考:
//仅对VC6
#include <stdio.h>
void fun1() {
    int f1=1;
    printf("fun1\n");
    printf("fun1\n");
}
void fun2() {
    int f2=2;
    printf("fun2\n");
}
void fun3() {
}
void main() {
#ifdef _DEBUG
    printf("sizeof(fun1)==%d\n",*(int *)((int)fun2+1)-*(int *)((int)fun1+1));
    printf("sizeof(fun2)==%d\n",*(int *)((int)fun3+1)-*(int *)((int)fun2+1));
//sizeof(fun1)==59
//sizeof(fun2)==43
#else
    printf("sizeof(fun1)==%d\n",(int)fun2-(int)fun1);
    printf("sizeof(fun2)==%d\n",(int)fun3-(int)fun2);
//sizeof(fun1)==32
//sizeof(fun2)==16
#endif
}
说函数是一种数据类型的,你得去找他才能知道原委。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在c/c++中如何理解,函数也是种数据类型