Это становится основой того, как C различает истину и ложь.
True - любое ненулевое значение (любой бит в целом числе). В то время как тесты условий, такие как ==
и >
, выдают значение 1
, любое ненулевое значение работает на true.
False - это значение нуля (все биты выключены) в целое число), который включает NULL
в указателях.
Значение '\0'
, конечно, является двоичным нулем, поэтому (*s2++=*s1++)
в части условия for
выполняет неявный тест для ненулевой, так что это работает, и до тех пор, пока \0
не будет скопирован. \0
возвращает false и выходит из l oop. Добавление собственного !='\0'
добавляет явный тест для того же самого.
Осторожно: Если вы просто использовали неправильный *s1++ = *s2++ != '\0'
без скобок, он будет рассматриваться как очень глючный *s1++ = (*s2++ != '\0')
, который назначит серию из 1 для * s1, за которой следует '\0'
для завершения «строки». К сожалению.