OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4293|回复: 12

和大家分享一个代码,个人认为考验C语言水平

[复制链接]

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
发表于 2023-7-13 11:01:55 | 显示全部楼层 |阅读模式
  • for(TempC = 1; TempC < (ReceiveNum % 7)  ?  (ReceiveNum % 7)  :  8;  TempC++)
  • {
  •        VersionInfo[TempD] = RxFrame.Data[TempC];
  •        TempD++;
  • }
    代码如上述所示,补充:1、ReceiveNum的值是29恒定不变,结构体成员Data的数组大小是8, VersionInfo的数组大小是64。   这个代码有没有问题?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-13 14:17:48 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-7-13 14:22 编辑
sfd123 发表于 2023-7-13 12:30
不会啊,TempC在++啊

ReceiveNum的值是29,那么
TempC < (ReceiveNum % 7)  ?  (ReceiveNum % 7)  :  8
就相当于
TempC < 1  ?  1 :  8
相当于
if(TempC < 1)
   表达式的值=1;
else
  表达式的值=8;
这个问号语句的值要么是1要么是8,总之非0,for循环就会一直循环;

相当于
for(TempC = 1; 1;  TempC++)   

for(TempC = 1; 8;  TempC++)

可能造成数组越界、死机。
这代码为什么整得这么复杂呢,用if语句多好。





专治疑难杂症
回复 支持 1 反对 0

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-13 11:57:56 | 显示全部楼层
TempC < (ReceiveNum % 7)  ?  (ReceiveNum % 7)  :  8


循环条件的值好像一直是非零,那不成死循环了?
专治疑难杂症
回复 支持 反对

使用道具 举报

12

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2555
金钱
2555
注册时间
2017-12-16
在线时间
188 小时
发表于 2023-7-13 12:30:43 | 显示全部楼层
LcwSwust 发表于 2023-7-13 11:57
TempC < (ReceiveNum % 7)  ?  (ReceiveNum % 7)  :  8


不会啊,TempC在++啊
回复 支持 反对

使用道具 举报

12

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2555
金钱
2555
注册时间
2017-12-16
在线时间
188 小时
发表于 2023-7-13 12:32:13 | 显示全部楼层
TempD 这个 要注意一下,不要造成VersionInfo溢出就好
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-9-23
在线时间
1 小时
发表于 2023-7-13 12:54:17 | 显示全部楼层
本帖最后由 kerongsheng 于 2023-7-13 12:56 编辑

死循环,TempC的数值从1开始自增,表达式TempC < (ReceiveNum % 7) 永远不成立,8为非0,?表达式的值一直是1
回复 支持 反对

使用道具 举报

5

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
442
金钱
442
注册时间
2021-11-22
在线时间
141 小时
发表于 2023-7-14 09:31:50 | 显示全部楼层
LcwSwust 发表于 2023-7-13 14:17
ReceiveNum的值是29,那么
TempC < (ReceiveNum % 7)  ?  (ReceiveNum % 7)  :  8
就相当于

膜拜大佬的讲解...
请问 ? 1:8是什么意思啊?
回复 支持 反对

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2023-7-14 09:58:42 | 显示全部楼层
1759817440 发表于 2023-7-14 09:31
膜拜大佬的讲解...
请问 ? 1:8是什么意思啊?

C语言表达式    你百度一下问号冒号表达式就知道了
学无止境
回复 支持 反对

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2023-7-14 09:59:04 | 显示全部楼层
这种代码写出来是被人骂的,不是体现C语言水平的
学无止境
回复 支持 反对

使用道具 举报

74

主题

182

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2021-2-5
在线时间
133 小时
 楼主| 发表于 2023-7-14 10:09:33 | 显示全部楼层
LcwSwust 发表于 2023-7-13 14:17
ReceiveNum的值是29,那么
TempC < (ReceiveNum % 7)  ?  (ReceiveNum % 7)  :  8
就相当于

这个代码是在项目里面的,ReceiveNum是在动态变化的,所以这么写,答案就是这样的,小于运算符优先级高,所以会先结合,最后导致死循环,我一开始这么写导致死循环都没意识到,后来发现是怎么回事之后,觉得很有意思,就和大家分享一下
回复 支持 反对

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-14 10:54:57 | 显示全部楼层
1759817440 发表于 2023-7-14 09:31
膜拜大佬的讲解...
请问 ? 1:8是什么意思啊?

百度 C语言问号表达式
专治疑难杂症
回复 支持 反对

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-7-14 11:01:18 | 显示全部楼层
15284083060 发表于 2023-7-14 10:09
这个代码是在项目里面的,ReceiveNum是在动态变化的,所以这么写,答案就是这样的,小于运算符优先级高, ...

我也老记不住优先级,所以看别的人的码都要查一下,自己写就多加括号.
非必要就不用问号语句了,用if挺好的.
专治疑难杂症
回复 支持 反对

使用道具 举报

12

主题

156

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2555
金钱
2555
注册时间
2017-12-16
在线时间
188 小时
发表于 2023-7-14 11:51:15 | 显示全部楼层
LcwSwust 发表于 2023-7-13 14:17
ReceiveNum的值是29,那么
TempC < (ReceiveNum % 7)  ?  (ReceiveNum % 7)  :  8
就相当于

你是对的!
我是想当然的当成TempC <( (ReceiveNum % 7)  ?  (ReceiveNum % 7)  :  8)
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 04:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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