c语言一个关于printnum的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言一个关于printnum的问题相关的知识,希望对你有一定的参考价值。

void printnum(long n,void (*p)() )

if(n<0)

(*p)('-');

n=-n;

if(n>=10)

printnum(n/10,p);

(*p)(n%10+'0');


这个好像是说移植性问题的,我是初学者先不考虑这么远的,这个函数指针(*p)()的用法不是很理解啊,
到时候真的要print的时候就print(n,printf)?那里面的(*p)('-')了后面又(*p)(n%10+'0')虽然我不清楚但是内存中的 ‘-’ 不会被n%10+'0'覆盖吗?求高手指点!!!!!!!!

参考技术A >到时候真的要print的时候就print(n,printf)?

要打印数的时候用printnum(n, &printf); 这样的方式有可能会编译过不了,因为你的代码里传递给p的参数是字符型的,而不是字符指针型,与printf的参数类型不符合,需要封装一下:
void printc(char c)



printf("%c", c);


而后使用printnum(n, &printc); 这样的方式。

>那里面的(*p)('-')了后面又(*p)(n%10+'0')虽然我不清楚但是内存中的 ‘-’ 不会被n%10+'0'覆盖吗?

不会,因为(*p)('-')执行的时候是直接跳转到函数里执行,这条语句执行完了后,printf函数也走完了,打印的字符串也已经输出到外部设备了,所以执行到后面(*p)(n%10+'0')的时候前面的'-'早已显示在屏幕上了。本回答被提问者采纳
参考技术B void printnum(long n,void (*p)() );第二个参数表示传的一个函数指针,传入的函数它的参数要和参数对应也为空。printnum是个递归函数,都不知道你表达什么意思。

关于C语言的语法中类型转换的一个问题。求教C语言高手。

在Lua语言的源代码中有如下宏定义:
#define UNUSED(x) ((void)(x)) /* to avoid warnings */
有如下用法:
static void f_luaopen (lua_State *L, void *ud) global_State *g = G(L);// get global_State ptr saved in lua_State UNUSED(ud);// 这一句看不懂,求指导~ stack_init(L, L); /* init stack */ sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ luaT_init(L); luaX_init(L); luaS_fix(luaS_newliteral(L, MEMERRMSG)); g->GCthreshold = 4*g->totalbytes;
我不知道上面函数中第二句的作用。求指教!谢谢!

参考技术A 有误吧?UNUSED的宏定义是变量类型,而代码中UNUSED(ud)的ud是指针啊!如果宏定义是#define UNUSED(x) ((void *)(x))的话就正确了。 参考技术B #define UNUSED(x) ((void)(x)) 这是宏定义 在编译的时候 把UNUSED(x)替换为((void)(x))编译
就像#define PI 3.14一样
所以那句在编译的时候按照((void)(ud))编译追问

谢谢您的回答!

我能理解您的意思。但是单独的一行转换

((void)ud);

有什么意义呢?

下面是源代码:

追答

你注释说的很清楚了 避免警告 如果ud只定义不使用 编译时就会有警告 单独这一句就是为了使用它 避免警告 你可以把这句注释掉再编译试试 比较不同

追问

学习了!谢谢您!

本回答被提问者采纳

以上是关于c语言一个关于printnum的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言的问题

关于C语言指针的问题

关于C语言里面指针赋值的类型问题,还有一些关于指针的问题

关于C语言关闭窗口的问题

关于C语言的位运算的问题

关于C语言的语法中类型转换的一个问题。求教C语言高手。