如何在C语言的for
指令中编写while
/ #define
循环?
答案 0 :(得分:10)
您可能正在寻找\
来跨多行继续宏定义:
#define LOOP(start, end) \
for (int i = (start); i < (end); i++) { \
printf("%d\n", i); \
}
答案 1 :(得分:9)
简短回答是“不要”。但如果你拥有,为了所有神圣的爱不要这样做:
#define FOREACH(start, end) \
for (; (start) < (end); (start)++) \
{ \
// do something interesting \
}
Bad juju一路走来。请注意,start
必须对应左值;您无法将其称为FOREACH(1,10)
,FOREACH((a+b), c)
或FOREACH(x++,y++)
。所有这些都会导致编译时错误(++
的操作数必须是左值,而1
,a+b
或x++
都不符合条件。将其称为FOREACH(x, y++)
将执行真正不希望它执行的操作。同样,您也不希望将其称为FOREACH(x, y())
。
您可以通过执行类似
之类的操作来防范这些问题#define FOREACH(start, end) \
do { \
int i; \
int j = end; \
for (i = start; i < j; i++) { \
// do something interesting \
} \
} while (0)
基本上,您正在创建与宏参数对应的局部变量。这可以防止start
不是左值,反对end
具有应用的副作用或者是每次迭代调用的函数。
但是如果你试图封装一个经常调用的循环,将它放在自己独立的函数中。理解和维护更安全,更容易。
答案 2 :(得分:4)
#define something for(;;) printf("hooray, i'm in infinite loop!");
int main() { something }
答案 3 :(得分:4)
由于C不要求语句在单独的行上,您可以简单地一起刷成一行:
#define M while (...) { ...; ...; }
或者您可以在宏定义中转义换行符:
#define M \
while (...) { \
...; \
...; \
}
答案 4 :(得分:2)
#define foo(x) do { \
for(x=0;x<4;x++) x; \
} while(0) // note lack of trailing ;
或在gnu c:
#define foo(x) ({ \
for(x=0;x<4;x++) x; \
})
后者可以用作表达式,虽然这个类型为void,因此不是很有用。
答案 5 :(得分:1)
这对于循环来说是更通用的
#include <stdio.h>
#include <string.h>
#define for_loop(start, end, incr) for(i = start; \
i < end; \
i += incr)
int main()
{
int i=0, j=5;
for_loop(i, j, 1)
printf("%d\n", i+1);
return 0;
}