次のコードを検討してください。
char* str=NULL;
if(str!=NULL && str[0]=='h')
printf("ok");
確認された最初の条件は、str が NULL ではないことです。このコードをコンパイルして実行しようとしましたが、セグメンテーション違反は発生しません。
これは、コードが if の次の命令で中断することを意味します。これは、str[0] が and であるため、str[0] が 'h' に等しいことをさらに検証する必要がないためです。
しかし問題は、これがすべてのコンパイラで動作することが保証されているかどうかです。何らかの理由で、最初に str が 'h' と等しいことを確認し (セグメンテーション違反を引き起こします)、次に str が NULL でないことを確認するアセンブリ コードをコンパイラが生成することはあり得ませんか?