C++ conditional testing fails, why?

Click For Summary

Discussion Overview

The discussion revolves around a C++ programming issue where a conditional statement does not behave as expected. Participants explore potential reasons for the for loop executing despite the condition appearing to be false based on the returned value from a test function. The scope includes technical explanations and debugging strategies.

Discussion Character

  • Technical explanation
  • Debugging strategies
  • Debate/contested

Main Points Raised

  • One participant notes that constants can be used in expressions and suggests checking the values of variables before the conditional statement to understand the behavior.
  • Another participant questions whether a semicolon was mistakenly placed after the if statement, which would lead to an if statement with no body.
  • Concerns are raised about the use of macros, with a suggestion to use well-typed constants instead, although this is noted as unrelated to the current problem.
  • A participant mentions using g++ 4.1.2 on RISC OS and expresses uncertainty about potential bugs in that version, as well as the lack of a debugger.
  • Several participants recommend adding output statements to verify the values of variables involved in the conditional check.

Areas of Agreement / Disagreement

Participants do not reach a consensus on the cause of the issue, with multiple potential explanations and debugging strategies proposed. The discussion remains unresolved regarding the specific reason for the unexpected execution of the for loop.

Contextual Notes

Limitations include the absence of a debugger for the participant's operating system and the potential for version-specific bugs in the compiler being used.

John O' Meara
Messages
325
Reaction score
0
I have a long C++ program that has a few simple statements in it. At the beginning I have ;
#define NUM_DP 10

Further on in the program I have this conditional statement;

short int ct, j;
.
.
.
ct = op2.test(op2.num);

if (ct < (NUM_DP - 1))
for (j = 1; j < 20; j++){


code block
}

The test function returns a value of ct = 9, why then does the for loop execute . Can't you use constants inside conditional statements? Please help. Thanks.
 
Technology news on Phys.org
John O' Meara said:
I have a long C++ program that has a few simple statements in it. At the beginning I have ;
#define NUM_DP 10

Further on in the program I have this conditional statement;

short int ct, j;
.
.
.
ct = op2.test(op2.num);

if (ct < (NUM_DP - 1))
for (j = 1; j < 20; j++){


code block
}

The test function returns a value of ct = 9, why then does the for loop execute . Can't you use constants inside conditional statements? Please help. Thanks.
Constants are fine in expressions. There are pitfalls for certain defines (side effects and such), but that's not relevant here.

I don't see why it's running the for loop. Mind you, I would use curly braces for the if statement (around the for loop), but that should work. Can't say without perhaps seeing the entire bit of code.

I would suggest you either use a debugger and check the variables right before the if, or add a print in there to see the values right before the if. Something like:
Code:
std::cout << "ct = " << ct << "; NUM_DP - 1 = " << (NUM_DP-1) << "; (ct < (NUM_DP-1)) = " << (ct < (NUM_DP-1)) << std::endl;

You should be able to see right away if the values are other than you think. Note that I just whipped out that line. I think it should be right, but I never assume that until it's compiled and tested. :smile: Make sure to #include <iostream> of course.
 
It is g++ 4.1.2, that I am using, I am just woundering if it is a bug in the version I have for my RISC OS operating system, there is no gdb debugger for my system only a gdbserver which I think requires a remote gdb to work. I will try butting braces around for loop as you suggested. Thanks.
 
Since you don't have a debugger, add some output statements as grep suggests, to see the value of ct and (NUM_DP - 1).
 
You might want to check that you haven't accidentally put a semicolon after the if, like so:

if (ct < (NUM_DP - 1));

as that'll indicate an if with no body. Braces shouldn't make a difference, so unless you're using a hacked-up compiler with a modified parser or funny extensions there's no reason to think that they're the cause of the problem, though stylistically they're a good idea.

Also, though unrelated to the problem, you should really avoid macros unless you have some compelling reason to use them. C++ allows you to define well-typed constants. Macros are just direct text substitutions.

static short int const numDP = 10;
 

Similar threads

Replies
1
Views
2K
  • · Replies 34 ·
2
Replies
34
Views
6K
  • · Replies 17 ·
Replies
17
Views
4K
  • · Replies 9 ·
Replies
9
Views
3K
  • · Replies 6 ·
Replies
6
Views
12K
Replies
55
Views
7K
  • · Replies 18 ·
Replies
18
Views
3K
  • · Replies 23 ·
Replies
23
Views
3K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 5 ·
Replies
5
Views
3K