C程序逐字读取数字,结果不正确
有人能帮我找出问题吗?问题在于操作员优先级<代码>c=peekchar()!=EOF被分组为C程序逐字读取数字,结果不正确,c,C,有人能帮我找出问题吗?问题在于操作员优先级c=peekchar()!=EOF被分组为c=(peekchar()!=EOF),因此c要么是0要么是1,这说明了结果 用(c=peekchar())修复EOF 或者,假设isdigit为EOF定义为0,则循环条件可以简化为 M1508444:CProg sb054043$ gcc -g3 readNumber.c -o readNumber M1508444:CProg sb054043$ ./readNumber 123 0 问题在于运算符优先级
c=(peekchar()!=EOF)
,因此c
要么是0
要么是1
,这说明了结果
用(c=peekchar())修复EOF
或者,假设isdigit
为EOF
定义为0,则循环条件可以简化为
M1508444:CProg sb054043$ gcc -g3 readNumber.c -o readNumber
M1508444:CProg sb054043$ ./readNumber
123
0
问题在于运算符优先级<代码>c=peekchar()!=EOF被分组为
c=(peekchar()!=EOF)
,因此c
要么是0
要么是1
,这说明了结果
用(c=peekchar())修复EOF
或者,假设isdigit
为EOF
定义为0,则循环条件可以简化为
M1508444:CProg sb054043$ gcc -g3 readNumber.c -o readNumber
M1508444:CProg sb054043$ ./readNumber
123
0
您好,您需要修改while循环,如下所示:-
while (isdigit(c = peekchar())){
首先,您需要读取该值并将其存储在变量
c
中,这可以通过执行(c=peekchar())
来实现。一旦值存储在c
中,现在您的while循环将首先检查它是否为EOF
,如果不是,则只检查它是否为数字。您好,您需要修改while循环,如下所示:-
while (isdigit(c = peekchar())){
首先,您需要读取该值并将其存储在变量c
中,这可以通过执行(c=peekchar())
来实现。一旦值存储在c
中,现在您的while循环将首先检查它是否为EOF
,如果不是,则只检查它是否为数字。:问题的根本原因是而((c=peekchar()!=EOF)&&isdigit(c))
是一种可怕的代码编写风格。你为什么要把这些都塞进一行代码?你从这样的代码中得到了什么,除了代码如此破烂以至于你无法找到问题之外?@AndrewHenle:尽管如此,这是惯用的C(没有括号滑动),所以应该是可读的。在本例中,虽然表达式进一步简化了。@Bathsheba OK,但这使它成为一个容易出现错误的习惯用法,对于没有经验的程序员来说,调试起来尤其困难,因为有太多的工作要做。再说一次,使用多条线路有什么好处?我看到过对“代码简洁性”的引用,似乎这本身就是一个目标。我认为,任何以“代码简洁性”为目标的人都没有真正思考过问题,也没有人负责修复在凌晨2点和2000英里外突然出现的bug。我更喜欢用一种实际上有助于防止引入错误的风格来编写代码,比如这里的那种:问题的根本原因是,而((c=peekchar()!=EOF)&&isdigit(c))
是编写代码的可怕风格。你为什么要把这些都塞进一行代码?你从这样的代码中得到了什么,除了代码如此破烂以至于你无法找到问题之外?@AndrewHenle:尽管如此,这是惯用的C(没有括号滑动),所以应该是可读的。在本例中,虽然表达式进一步简化了。@Bathsheba OK,但这使它成为一个容易出现错误的习惯用法,对于没有经验的程序员来说,调试起来尤其困难,因为有太多的工作要做。再说一次,使用多条线路有什么好处?我看到过对“代码简洁性”的引用,似乎这本身就是一个目标。我认为,任何以“代码简洁性”为目标的人都没有真正思考过问题,也没有人负责修复在凌晨2点和2000英里外突然出现的bug。我更喜欢用一种风格来编写代码,这种风格实际上有助于防止引入像这里这样的bug。