Re:1/0 = 0
by user5994461 on Friday August 10, 2018 @07:45PM
(#17737481)
It's invalid code in C, C++ and Java.
[ Parent
| on HN ]
Boolean operators returning values is common, especially in dynamically typed languages. The code is valid in JavaScript, for example, and in Python (except it uses "or" instead of "||").
Re:1/0 = 0
by user5994461 on Friday August 10, 2018 @08:24PM
(#17737607)
In python, it should probably be corrected with // or 1.0 to make it either an integer division or a float division.
Ah, that's true. Good point.
This is valid C and C++.
It is, but it will always give you a divisor of 1 (because "true" is 1 -- I also thought it would work until I tested it):
% cat >division.c <<EOF
#include <stdio.h>
int main(void)
{
printf("1/0 = %d\n", 1 / (0 || 1));
printf("1/2 = %d\n", 1 / (2 || 1));
printf("1.0/0 = %f\n", 1.0 / (0 || 1));
printf("1.0/2 = %f\n", 1.0 / (2 || 1));
}
% gcc -Wall -o divison divison.c
% ./divison
1/0 = 1
1/2 = 1
1.0/0 = 1.000000
1.0/2 = 1.000000
In Python this is not the case: % python3
>>> 1 / (0 or 1)
1
>>> 1. / (0 or 1)
1.0
>>> 1 / (0 or 1)
1
>>> 1. / (2 or 1)
0.5
% python3
>>> 1 / (0 or 1)
1.0
>>> 1 / (2 or 1)
0.5Some trivia: GNU extensions to C/C++ include a "?:" operator that does what you'd want in this case, e.g.
x / (divisor ?: 1)
Re:1/0 = 0
by user5994461 on Saturday August 11, 2018 @06:09AM
(#17739103)
It shouldn't be valid in C++. booleans cannot participate in arithmetic operations. You will get a warning from the compiler if you are lucky.
C doesn't have booleans and treat them as integers 0 or 1, it can do the math and will always return 1.
That's not true. C++ does define an implicit conversion from bool to int:
https://en.cppreference.com/w/cpp/language/implicit_conversi... (under "Integral promotion")
And C has a boolean type as of C99.
What do you expect for that C code?