ist dies ein guter Weg, um eine strcmp zurückzukehren falsch, wenn Strings sind leer zu tun

StackOverflow https://stackoverflow.com/questions/1606596

  •  05-07-2019
  •  | 
  •  

Frage

Ich möchte eine andere Bedingung --still eine schnelle Ausführungszeit beibehalten, aber Sicherheit - wo ich falsch zurück, wenn eine oder beide Strings leer ist:

int speicial_strcmp(char *str1, char* str2 )
{

    if(*str1==*str2 =='\0')
         return 0;

     return strcmp(str1,str2);

}
War es hilfreich?

Lösung

Nein, das ist kein guter Weg, es zu tun, weil es nicht funktioniert.

if(*str1==*str2 =='\0')

wird erhalten ausgewertet als:

bool tmp1 = *str1==*str2;
bool tmp2 = tmp1 == '\0';
if (tmp2)

Mit anderen Worten, da der Boolesche auf eine ganze Zahl befördert zu werden, wird Ihr Test true zurück, wenn die Saiten mit verschiedenen Charakteren beginnen (tmp1 wird falsch sein, die auf 0 umgewandelt werden, und so tmp2 wird true)

Versuchen Sie nicht, den Compiler auszutricksen. schnellen Code zu schreiben ist nicht so wenige Zeilen Code wie möglich oder sogar als kurze Linien wie möglich über das Schreiben. Auch wenn == auf diese Weise sinnvoll Verkettungs zusammen war, gibt es keinen Grund, warum es schneller sein würde. Schreiben Sie einfach Code, den Sie verstehen und korrekt schreiben.

Andere Tipps

Auch wenn Sie die früh-out-Tests implementieren Sie richtig vorschlagen, Sie sind sehr unwahrscheinlich, Dinge schneller zu machen, indem diese Art der Sache zu tun -. strcmp wird dies bereits tun, oder fast die

Hier ist der Code für strcmp():

int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  register const unsigned char *s1 = (const unsigned char *) p1;
  register const unsigned char *s2 = (const unsigned char *) p2;
  unsigned reg_char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
    return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

Es ist schon so schnell, wie es sinnvoll sein könnte. Ihre Fremdprüfung macht nur die Fälle, Sie sind nicht daran interessiert, langsamer.

if( *str1 == 0 || *str2 == 0 )
   return 0;

Das Beispiel werden Sie nicht einmal richtig laufen gegeben haben. strcmp() wird an den ersten unterschiedlichen Zeichen stoppen. Wenn beide Strings leer sind, wie zufrieden von Ihrem „Sonderfall“ oben, wird dies ebenso schnell wie das Beispiel behandelt werden Sie gegeben haben.

einen speziellen Handler Durch das Hinzufügen beiden Saiten wie oben leer, du hast gemacht nur die Fälle, in denen sie nicht sind, entsprechend langsamer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top