Solved

C++: strcmp - how does it work?

Posted on 2010-08-29
8
927 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
8 Comments
 
LVL 84

Accepted Solution

by:
ozo earned 500 total points
ID: 33554974
==0 is false, != 0 is true
0
 

Author Comment

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

Expert Comment

by:phoffric
ID: 33555044
>> 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
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:Zenoture
ID: 33555058
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
 
LVL 32

Expert Comment

by:phoffric
ID: 33555063
Isn't it great when things make sense!
0
 

Author Comment

by:Zenoture
ID: 33555075
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
ID: 33555078
though*
0
 
LVL 32

Expert Comment

by:phoffric
ID: 33555995
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

Secure Your Active Directory - April 20, 2017

Active Directory plays a critical role in your company’s IT infrastructure and keeping it secure in today’s hacker-infested world is a must.
Microsoft published 300+ pages of guidance, but who has the time, money, and resources to implement? Register now to find an easier way.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
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…
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.
The viewer will learn how to use and create keystrokes in Netbeans IDE 8.0 for Windows.

756 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