I have an if stmt which checks to see if a char value (upper or Lower) is equal to a value input by end user. My understanding was if you are using a char value in a conditional stmt you need to put single quotes around the char value. If that is correct than I could use some help figuring out why my if/else stmt is not working. It is ignoring the if stmt I think. Thanks for any help.

{
        //Variable declaration
    int AccountNumber; 
    char ServiceType; 
    int RegServiceMinutes = 0;
    int PremDayMinutes = 0;
    int PremNightMinutes = 0;
    double rAmount;
    double pAmount;
//	double AmountDue;
    cout << fixed << showpoint;                     
    cout << setprecision(2);                      

    cout << "This program calculates and prints a cellular phone bill" << endl;
   cout << endl;

    cout << "Enter account number: " ;  
    cin >> AccountNumber;                           
    cout << endl;
    cout << "Enter Service type: " 
        << "R or r (Regular Service) "
        << "P or p (Premium Service)  ";  
    cin >>  ServiceType;  
// cout << endl;

	if (ServiceType == 'r' || 'R')
	{ 
	cout << "Enter number of minutes used for Regular Service:  ";
	cin  >> RegServiceMinutes;
	}
	else
	{
	cout << "Enter number of day minutes used for Premium Service:  ";
	cin  >> PremDayMinutes;
	cout << endl;
	cout << "Enter number of night minutes used for Premium Service:  ";
	cin  >> PremNightMinutes;
	cout << endl;

You can not compare more than 1 value in a particular comparison statement. You use the logical operators to combine multiple comparisons to produce a net result.

not legal:
if (aValue == 1 || 2)

if (1 < aValue < 4)


legal:
if (aValue == 1 || aValue == 2)

if (1 < aValue && aValue < 4)


better legal:
if (1 == aValue || 2 == aValue)

Edited 6 Years Ago by Fbody: n/a

Just reading trough this, but why is if(1 == aValue || 2 == aValue) better legal than the other (just legal) one?

Just reading trough this, but why is if(1 == aValue || 2 == aValue) better legal than the other (just legal) one?

It reduces the likelihood of accidentally using an assignment statement (a = 1) instead of an equality statement (a == 1). If you do attempt an assignment, the compiler will flag it as a syntax error because you are trying to modify a constant value.

start quote:

if (ServiceType == 'r' || 'R')
{ 
cout << "Enter number of minutes used for Regular Service:  ";
cin  >> RegServiceMinutes;
}
else
{
cout << "Enter number of day minutes used for Premium Service:  ";
cin  >> PremDayMinutes;
cout << endl;
cout << "Enter number of night minutes used for Premium Service:  ";
cin  >> PremNightMinutes;
cout << endl;

end quote.

ur missing a closing bracket "}" to end the else part of the statement

Edited 3 Years Ago by mike_2000_17: Fixed formatting

> It reduces the likelihood of accidentally using an assignment statement (a = 1) instead of an equality statement (a == 1)
Or it increases the likelyhood of making a mistake when you have (var1 == var2), and no amount of rearranging the code will save you.

Plus, a lot of people find such code to be highly unreadable.

Further, operand swapping zealots also extend this to the relational operators as well (<, > etc), where there is absolutely no value in doing so. I've seen people introduce BUGS into working code because they made a mess of it.

Most modern compilers will diagnose use of = in an if statement right off the bat, without having to mess with the code at all. And this includes the important edge case where rearranging fails.

http://c-faq.com/style/revtest.html
It's from a time long ago when compilers only had error messages, and blindly generated code so long as it was syntactically correct.
If you're still using such a compiler, consider upgrading.

you original if

if (ServiceType == 'r' || 'R')

should be changed to this

if (ServiceType == 'r' || ServiceType == 'R')

> It reduces the likelihood of accidentally using an assignment statement (a = 1) instead of an equality statement (a == 1)
Or it increases the likelyhood of making a mistake when you have (var1 == var2), and no amount of rearranging the code will save you.

Plus, a lot of people find such code to be highly unreadable.

Further, operand swapping zealots also extend this to the relational operators as well (<, > etc), where there is absolutely no value in doing so. I've seen people introduce BUGS into working code because they made a mess of it.

Most modern compilers will diagnose use of = in an if statement right off the bat, without having to mess with the code at all. And this includes the important edge case where rearranging fails.

http://c-faq.com/style/revtest.html
It's from a time long ago when compilers only had error messages, and blindly generated code so long as it was syntactically correct.
If you're still using such a compiler, consider upgrading.

I can see what you're saying. I used to have issues with that, then I saw the suggestion (here, on DaniWeb actually), so I ran with it. As my previous posts, and your link, demonstrate, it's really only useful on equality with a literal. There really is no point in using it in any other situation because it won't have any effect.

What compiler are you using that flags the operator error? As far as I know, I have a fairly modern compiler, but I don't think I've ever seen it reported before.

Edited 6 Years Ago by Fbody: n/a

> What compiler are you using that flags the operator error? As far as I know, I have a fairly modern compiler

$ cat foo.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char* argv[]) {
  if ( argc = 1 ) {
    printf( "Mmm, interesting...\n" );
  }
  return 0;
}

$ gcc -Wall foo.c
foo.c: In function ‘main’:
foo.c:6: warning: suggest brackets around assignment used as truth value

$ cl /W4 /nologo foo.c
foo.c
foo.c(5) : warning C4100: 'argv' : unreferenced formal parameter
c:\temp\foo.c(6) : warning C4706: assignment within conditional expression

gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Visual Studio is 2008 vintage.

This question has already been answered. Start a new discussion instead.