title: invalid operands to binary "|"
body: <p>While I am reading the FreeBSD source code about the <code>hlist</code> in the file <code>list.h</code>, I am confused about this macro: </p>
  
  <pre><code>#define hlist_for_each_entry_safe(tp, p, n, head, field)        \
  for (p = (head)-&gt;first; p ?                 \
      (n = p-&gt;next) | (tp = hlist_entry(p, typeof(*tp), field)) : \
      NULL; p = n)
  </code></pre>
  
  <p>and I am trying use the similar style in my function as below:</p>
  
  <pre><code>int *a;
  int *b;
  int *c;
  
  if(a ? (b = (int *)0x0c) | (c = (int *)malloc(sizeof(int)) : NULL){
  
      printf("test\n");
  }
  </code></pre>
  
  <p>when I use GCC compile it, the compiler give me the error, says:</p>
  
  <pre><code>invalid operands to binary "|"
  </code></pre>
  
  <p>I write my function in that way, because I think the condition of the "for" circulation returns "true" or "false", but in fact the compiler seems to tell me they are not the same.And then I do not understand the condition between "for" and "if".</p>
  
  <p>PS:My mother tongue is not English, maybe you could not understand it well, I am sorry about that.</p>