在宏或 typedef 的帮助下,C 中的有效表达式:(x) ((x) - 1)
Valid Expression in C with Help of Macro or typedef: (x) ((x) - 1)
在宏或 typedef 的帮助下,"expression" (x) ((x) - 1)
能否成为有效的 C 表达式?
当然可以。如果我们有这个宏
#define x int
那么你的表情就变成了(int)((int) - 1)
。它做了一个多余的 -1
到 int
的转换,然后再次转换结果。
毫无意义,但完全正确。
#define x foo
int foo(void *ptr)
{
return (x)(x -1) ;
}
#define DEC(x) ((x) - 1)
int main(void)
{
int i = 1;
printf("before DEC: %d\n", i);
i = DEC(i);
printf("after DEC: %d\n", i);
}
给你:
before DEC: 1
after DEC: 0
感谢@P__J__ 和@Lxer Lx 以及本书 C Traps and Pitfalls。
在前一个问题中我们只是寻求宏的帮助,但我发现 typedef
也很有帮助。
然后我得到了一个新的答案,如果我们认为未定义的函数指针算法是可以的:
#include <stdio.h>
typedef void (*T)(void *);
void m(void * ok){
printf("awesome\n");
}
int main(int argc, char *argv[]) {
T x = m;
(x) ((x) - 1);
return 0;
}
在宏或 typedef 的帮助下,"expression" (x) ((x) - 1)
能否成为有效的 C 表达式?
当然可以。如果我们有这个宏
#define x int
那么你的表情就变成了(int)((int) - 1)
。它做了一个多余的 -1
到 int
的转换,然后再次转换结果。
毫无意义,但完全正确。
#define x foo
int foo(void *ptr)
{
return (x)(x -1) ;
}
#define DEC(x) ((x) - 1)
int main(void)
{
int i = 1;
printf("before DEC: %d\n", i);
i = DEC(i);
printf("after DEC: %d\n", i);
}
给你:
before DEC: 1
after DEC: 0
感谢@P__J__ 和@Lxer Lx 以及本书 C Traps and Pitfalls。
在前一个问题中我们只是寻求宏的帮助,但我发现 typedef
也很有帮助。
然后我得到了一个新的答案,如果我们认为未定义的函数指针算法是可以的:
#include <stdio.h>
typedef void (*T)(void *);
void m(void * ok){
printf("awesome\n");
}
int main(int argc, char *argv[]) {
T x = m;
(x) ((x) - 1);
return 0;
}