If you cast between pointers and integers, you are also writing highly non-portable code. Using bit shift in place of a multiply or divide. This is a clarity issue. In the 70's, when C was being developed, the former would yield more efficient machine code, but today's compilers generate the same code in both cases, so readability should be your primary concern. Assignment inside conditional.
Many programmers have the attitude that simplicity equals saving as many keystrokes as possible.
The result can be to hide bugs that would otherwise be obvious. After all, it's pretty easy to mistakenly leave off the extra equals sign. By never using assignment within a conditional, you can tell by code inspection whether you've made a mistake. Again, the advantage is to eliminate a class of errors from your program, making it quicker to debug.