title: Is ((void*)0) a null pointer constant?
body: <p>I'm reading <a href="http://the-flat-trantor-society.blogspot.com/2014/02/c-standard-quibbles.html#more" rel="noreferrer">this blog post</a> and under the section <strong>Null pointer constants and parenthesized expressions</strong> the author references § 6.3.2.3 and § 6.5.1 from the ISO C standard and says:</p>
  
  <blockquote>
    <p>It <em>doesn't</em> say that a parenthesized null pointer constant is a null pointer constant.</p>
    
    <p>Which implies, strictly speaking, that <code>(void*)0</code> is a null pointer
    constant, but <code>((void*)0)</code> is not.</p>
  </blockquote>
  
  <p>Then:</p>
  
  <blockquote>
    <p>I'm sure that most C implementations do treat a parenthesized null pointer constant as a null pointer constant, and define <code>NULL</code> either as <code>0</code>, <code>((void*)0)</code>, or in some other manner.</p>
  </blockquote>
  
  <p>The two referenced sections say:</p>
  
  <p>§ 6.3.2.3</p>
  
  <blockquote>
    <p>An integer constant expression with the value 0, or such an expression
    cast to type void *, is called a null pointer constant.</p>
  </blockquote>
  
  <p>§ 6.5.1</p>
  
  <blockquote>
    <p>A parenthesized expression is a primary expression. <strong>Its type and value
    are identical to those of the unparenthesized expression.</strong> It is an
    lvalue, a function designator, or a void expression if the
    unparenthesized expression is, respectively, an lvalue, a function
    designator, or a void expression.</p>
  </blockquote>
  
  <p>Doesn't the bolded sentence contradict the author's claim that <code>((void*)0)</code> is not a null pointer constant?</p>