Solved

C++: strcmp - how does it work?

Posted on 2010-08-29
8
912 Views
Last Modified: 2013-11-17
Why is it that when you put !str.compare() it actually works? Doesn't the "!" actually mean false?

From my understanding, compare() checks every letter in the string and uses a counter to track if there are any differences. If the number returned is 0 then the string matches, anything else means that the string is not the same

In C++, 0 = true, and 1 = false (unless I'm mistaken) so why does the "!" if statement and the "== 0" if statement both work?
#include <iostream>

#include <string>

using namespace std;



int main()

{

  string str = "test";



  // if statement with !str.compare()

  if (!str.compare("test"))

     cout << "String Matched!" << endl;



  // if statement with == 0 str.compare()

  if (str.compare("test") == 0)

     cout << "String Matched!" << endl;



  return 0;

}

Open in new window

0
Comment
Question by:Zenoture
  • 4
  • 3
8 Comments
 
LVL 84

Accepted Solution

by:
ozo earned 500 total points
Comment Utility
==0 is false, != 0 is true
0
 

Author Comment

by:Zenoture
Comment Utility
well then that's why then lol. Thank you.
0
 
LVL 32

Expert Comment

by:phoffric
Comment Utility
>> In C++, 0 = true, and 1 = false (unless I'm mistaken)
C++ takes its definition of integer numeric values of true/false from C:
     false is 0
     true is not 0
===========
So, consider following if else statement (either C or C++):
    if( x ) {
        // do if x != 0
    }
    else {
        // do if x == 0
    }
===========

Only if x is 0 is the else body executed; for all other integers, the x != 0 body is executed.
===========
However, some functions return 0 which may or may not mean true. You have to read the api of the function to understand what the return value means.

See string::compare:
    http://www.cplusplus.com/reference/string/string/compare/

The return value of compare is "0 if the compared characters sequences are equal". This is not saying that a 0 means true, just that the sequences are equal.

  if (!str.compare("test"))
     cout << "String Matched!" << endl;
is equivalent to (my preferred way):
  if ( 0 == str.compare("test") ) // is str == "test"
     cout << "String Matched!" << endl;

===========
compare returns an int, so the first paragraph applies here. Since a 0 return value means that str == "test", and since 0 in a if test condition means false, then the ! (NOT) unary operator on 0 means NOT false, which is true.

===========
See section "Logical operators" in
       http://www.cplusplus.com/doc/tutorial/operators/

"The Operator ! is the C++ operator to perform the Boolean operation NOT, it has only one operand, located at its right, and the only thing that it does is to inverse the value of it, producing false if its operand is true and true if its operand is false. Basically, it returns the opposite Boolean value of evaluating its operand. For example:"
!(5 == 5) // is false since the expression at its right (5==5) is true

!(6 <= 4) // evaluates to true because (6 <= 4) would be false

!true    // evaluates to false

!false   // evaluates to true

Open in new window

0
 

Author Comment

by:Zenoture
Comment Utility
Oh... so i was wrong... but now the whole 0/1 true/false thing makes sense haha. Thanks a lot phoffric, you never cease to amaze me =)
0
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
LVL 32

Expert Comment

by:phoffric
Comment Utility
Isn't it great when things make sense!
0
 

Author Comment

by:Zenoture
Comment Utility
Of course! Thought why other languages tend to flip the meaning, I'll never understand...

It can't be THAT hard to stick to one standard can it? lol
0
 

Author Comment

by:Zenoture
Comment Utility
though*
0
 
LVL 32

Expert Comment

by:phoffric
Comment Utility
C++ was created in order to guarantee job security, so the standard had to be different. Here is the confession from the creator of C++.
    http://www.odgaard.org/jeod/funny/interview.html
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now