4
\$\begingroup\$

I answered a question on SO today, however it did't receive any up-votes, so I want to know what's wrong with my code.

The requirement is to compare the input numbers(granted to be positive) without logical, relational or bitwise operators, and insert the corresponding comparison sign between them. For example:

input: 4 6
output: 4 < 6
input: 10 2
output: 10 > 2
input: 2 2
output: 2 = 2

Here is my posted code:

#include <stdio.h>
int main(void)
{
 unsigned a, b;
 scanf("%u %u", &a, &b);
 printf("%u ", a);
 char relationship[] = {'<', '=', '>'};
 putchar(relationship[!!(a/b) - !!(b/a) + 1]);
 printf(" %u", b);
 return 0;
}

That OP wants to know how to insert a comparison sign(<, >, =) between the two numbers. But my emphasis is on how to determine the relationship of the two numbers.

See: https://stackoverflow.com/q/35532123/5399734 for the original question.

asked Feb 21, 2016 at 9:41
\$\endgroup\$
5
  • 1
    \$\begingroup\$ Isn't ! considered a logical operator? \$\endgroup\$ Commented Feb 21, 2016 at 17:38
  • 1
    \$\begingroup\$ Yes, it is. I've improved this code to avoid ! operators. See my posted code on SO: stackoverflow.com/a/35533732/5399734 \$\endgroup\$ Commented Feb 21, 2016 at 23:06
  • \$\begingroup\$ Should I post the improved code again by editing this question on code review? \$\endgroup\$ Commented Feb 21, 2016 at 23:08
  • \$\begingroup\$ The C spec has "... the logical negation operator !...". §6.5.3.3 5. Using ! does not meet "without logical, relational or bitwise operators" and neither does this answer \$\endgroup\$ Commented Feb 21, 2016 at 23:51
  • \$\begingroup\$ @sun qingyao Recommend against editing this code. This is a review of your code - as is. Changing the code invalidates the work done so far. You could post new code in a new question, adding links to this and that post for reference indicating the next one is a follow-on. Maybe including ideas from the review(s) done here. \$\endgroup\$ Commented Feb 21, 2016 at 23:57

1 Answer 1

3
\$\begingroup\$

That seems a fine solution. Some minor suggestions:

  • Instead of spelling out relationship as {'<', '=', '>'}, you could use simply "<=>"
  • Instead of printing a, the relation and b in separate statements, it will be more readable to print in a single printf
  • The expression !!(a/b) - !!(b/a) evaluates to -1, 0, 1, commonly returned by a cmp function. If you give the expression a name by putting it in a variable, that will ring a bell with many readers and make it easier to understand.

Something like this:

unsigned a, b;
scanf("%u %u", &a, &b);
int cmp = !!(a/b) - !!(b/a);
char relation = "<=>"[cmp + 1];
printf("%u %c %u\n", a, relation, b);
answered Feb 21, 2016 at 10:03
\$\endgroup\$
2
  • 1
    \$\begingroup\$ ! is a logical operator per the C spec. \$\endgroup\$ Commented Feb 21, 2016 at 23:53
  • \$\begingroup\$ He's right, and perhaps we can use (_Bool). Please take a look at my updated code on SO: stackoverflow.com/a/35533732/5399734 for details \$\endgroup\$ Commented Feb 21, 2016 at 23:58

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.