Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序逐字读取数字,结果不正确_C - Fatal编程技术网

C程序逐字读取数字,结果不正确

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=(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。