我对宏很陌生
我知道如何使用三元运算符条件
如何将其转换为#define
if(i==j)
{
count=count+1;
break;
}
我试试这个运气但似乎错了:
#define ifcount(i,j) ((i)==(j)? count=count+1\
break:0)
这是我想要转换的代码 http://pastebin.com/i7Tuyh00
答案 0 :(得分:2)
使用(滥用)宏来改变程序的流程通常是一个坏主意,因为读取代码的人(自己在几年内)可能会对程序流中的意外跳转感到惊讶。
那就是说,你的问题与三元运算符无关。实际上,三元运算符的右侧不能包含中断,只能包含表达式。
但宏是全能的,所以你可以这样做:
#define ifcount(i,j) if ((i)==(j)) { count=count+1; break; }
这个宏的主要问题是人们在使用它时会写;
,如果在另一个if /else
对之间使用它,它会破坏,没有大括号:
if (...)
ifcount(a,b);
else // <--- syntax error because the previous ; breaks the if /else relation
...;
标准解决方案是使用do/while(0)
成语:
#define do { ifcount(i,j) if ((i)==(j)) { count=count+1; break; } } while (0)
但这不起作用,因为break
会打破这个内部while
,而不是你想要的那个(信用到@abelenky)。
允许复合语句并以;
结尾的唯一其他C语句就是这个:
#define ifcount(i,j) if ((i)==(j)) { count=count+1; break; } else
问题是,如果您在使用;
时忘记添加ifcount(i,j)
,而不是编译器错误,您将获得静默编译并且行为方式出人意料地改变。
答案 1 :(得分:0)
我认为没有必要使用三元(?:
)运算符
所以这是使用if语句的宏。
#define IfCount(i,j) if ((i)==(j)) { count++; break; }
<强>用法:强>
IfCount(x,5);
好的,你们怎么看待这个?
#define IfCount(i,j) if ((i)==(j)) { count++; break; } do{}while(0)
最终的,孤立的do-while-0
有两个目的:
do{}while(0) else
无效。还有什么需要照顾的吗?