鱼C论坛

 找回密码
 立即注册
查看: 1575|回复: 9

[技术交流] C语言 一个奇怪的错误

[复制链接]
发表于 2022-7-7 17:02:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在学到打开和关闭文件这一章时,这个是一句正确的代码。
  1. while ((ch = fgetc(fp1))!= EOF)
复制代码

当我少了个括号,编译器会报错
  1. while (ch = fgetc(fp1) != EOF)
复制代码
  1. �: In function 'main':
  2. �:33:12: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  3.      while (ch = fgetc(fp1) != EOF)
复制代码

而当我再加一层括号,编译器就不会报错了
  1. while ((ch = fgetc(fp1) != EOF))
复制代码

但是获取到的是原本应打印的文本“123 你好 hello”被输出成“

所以有鱼油可以解释一下这段代码的运行顺序和为什么加了层括号就不会报错吗?
  1. while ((ch = fgetc(fp1) != EOF))
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-7-7 17:26:23 From FishC Mobile | 显示全部楼层
所以把这个语句拆开写就好了,没必要写复合语句的
事实上在哪里加括号是有讲究的,并不是编译没错就可以的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-7 17:40:17 | 显示全部楼层
while (ch = fgetc(fp1) != EOF)这一句中 !=的优先级大于 = ,所以会把true或false赋值给ch,这样就成了死循环所以警告你
又加了层括号相当于你欺骗编译器所以,不把它当成死循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-7 18:34:08 | 显示全部楼层
159662-会稽 发表于 2022-7-7 17:40
while (ch = fgetc(fp1) != EOF)这一句中 !=的优先级大于 = ,所以会把true或false赋值给ch,这样就成了死循 ...

死循环编译器是不会报错的吧。否则while(1)为什么给通过不报错?问题应该是这个赋值顺序是危险的,所以编译给了个建议(建议在赋值周围使用括号作为真值),而我刚好多加了个括号造成编译器不报错,这个问题就特别难发现了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-8 00:01:48 | 显示全部楼层
TomZz 发表于 2022-7-7 18:34
死循环编译器是不会报错的吧。否则while(1)为什么给通过不报错?问题应该是这个赋值顺序是危险的,所以编 ...

它这不是报错吧,warning是警告,ERROR才是报错呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-8 00:16:41 | 显示全部楼层
学了很久Python,我现在编写C语言已是寸步难行,但我的脑海里隐隐约约有点记得好像是重复打印了printf函数的第一个隐藏字符,或者是这个文件的第一个字符吧?只能等大佬来解读,你是至尊会员有没有特权让老甲鱼过来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-8 12:28:37 | 显示全部楼层
159662-会稽 发表于 2022-7-8 00:16
学了很久Python,我现在编写C语言已是寸步难行,但我的脑海里隐隐约约有点记得好像是重复打印了printf函数的 ...

这个是完整的错误代码。
  1.     while (ch = fgetc(fp1) != EOF)
  2.     {
  3.         putchar(ch);
  4.         fputc(ch, fp2);
  5.     }
复制代码

先运行fget(fp1)!=EOF,fp1指针指向的文件中有"123"三个数字,所以进行了三次while循环,每次ch都是int类型的1,然后1会被转为ascii码对应的字符输出到控制台和写入到文件,1对应的ascii码正是SOH(start of heading),你说的应该没错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-7-8 12:34:18 | 显示全部楼层
159662-会稽 发表于 2022-7-8 00:16
学了很久Python,我现在编写C语言已是寸步难行,但我的脑海里隐隐约约有点记得好像是重复打印了printf函数的 ...

但是SOH不是第一个字符的意思,是用于网络通讯的一个指令(报文开始)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-8 12:42:07 From FishC Mobile | 显示全部楼层
TomZz 发表于 2022-7-8 12:34
但是SOH不是第一个字符的意思,是用于网络通讯的一个指令(报文开始)

错误的代码有研究的意义????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-7-8 14:24:28 | 显示全部楼层
wp231957 发表于 2022-7-8 12:42
错误的代码有研究的意义????

用于防止下次错误,并积累经验,在下次报错时快速反应
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 03:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表