Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

This comes up every now and then. That code makes perfect sense. You write octal numbers by prefixing them with a zero, the same way you write hexadecimal numbers by prefixing them with a '0x'.

  strtol("06", NULL, 8);  //6
  strtol("08", NULL, 8);  //0
Is C bad? Should Kernighan and Ritchie feel bad?


C wasn't bad for making that design decision in 1973, to include syntactical space for octal numbers. Programmers actually used octal notation then. It made sense in an environment where contemporary tech included the PDP-8's 12-bit words (four octal glyphs) and displays of seven-segment numeric readouts (where octal is useful, as letters for hexadecimal can't be displayed and base-10 needs conversion logic.)

Javascript was bad for making that design decision in 1995, when nobody seriously used octal for anything, so the leading zero was vastly more likely to introduce a class of WTF bugs instead.


No, because strtol gives you the ability to see that the parse failed and where. You chose to give it NULL there, but you could choose to use the function correctly. You can't do it correctly in the javascript and PHP cases. In the PHP case, it is actually just a bug in the PHP codebase that octal digits are supported at all, and they don't use strtol correctly. Note that perl, python and ruby all support octal digits correctly, there really is no excuse for PHP and javascript not to.


> You can't do it correctly in the javascript ... case

Sure you can. Read the Fine manual: https://developer.mozilla.org/en-US/docs/JavaScript/Referenc...

tldr: parseInt("08", 10);


We're not talking about parsing in base 10, we're talking about parsing in base 8. I need to be able to tell if the parse succeeded or not, silently hiding errors is bad. The correct behaviour demonstrated in perl and python:

    $ perl -le 'print 07'
    7
    $ perl -le 'print 08'
    Illegal octal digit '8' at -e line 1, at end of line
    Execution of -e aborted due to compilation errors.
    $ python -c 'print 07'
    7
    $ python -c 'print 08'
      File "", line 1
        print 08
       	^
    SyntaxError: invalid token


Got to admit, I am disappointed that

> parseInt("08", 8);

returns 0 instead of NaN


Returning 0 makes perfect sense. parseInt matches an integer from the beginning of the string, so it reads the 0 and then stops at the 8 because 8 is not a valid digit in base 8.

    >>> parseInt("123foobar", 10)
    123


Good point.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: