登录 立即注册

首页 > 绿虎论坛 > 建站 > 讨论/求助 (发帖)

标题: 这个有 4 个分支的 if 语句,能如何化简逻辑,变成仅一个条件的 三目运算(条件 ? 为真时执行 : 为假时执行)呢?

作者: @Ta

时间: 2023-01-13发布,2023-01-13修改

点击: 12026

原问题是一个关于 SQLite 触发器的问题。用 C 系语言描述逻辑如下:

// 只更新了行政区划代码,则按这个代码进行后续逻辑
if (new_addr == old_addr && new_code != old_code)
    return new_code;

// 只更新了地址,则解析出地址对应的行政区划代码,再后续逻辑
else if (new_addr != old_addr && new_code == old_code)
    return parse(new_addr);

// 两者都没更新,则是来自 INSERT 触发器的(SQLite 不支持合并 INSERT UPDATE 触发器)
// 提供了行政区划代码,则优先使用,否则解析提供的地址
else if (new_code == NULL)
    return parse(new_addr);
else
    return new_code;

其中,parse(new_addr) 实际是 40 行左右的 SQL 代码。重复写两次太冗余了,需要化简成一个。

我目前看不出啥共性,只能老老实实列出所有情况后,改写成一个位运算:

return (1 << (((new_addr == old_addr) << 2) | ((new_code == old_code) << 1) | (new_code == NULL))) & 0x71 ? new_code : parse(new_addr);

但看起来,可读性太差,维护起来麻烦。

还能化简成啥更直观、易维护的逻辑呢?


[隐藏样式|查看源码]


『回复列表(8|隐藏机器人聊天)』

1. image.png(14.39 KB)image.png(28.81 KB)
(/@Ta/2023-01-13 13:33//)

2.
没毛病 加油加油加油
(/@Ta/2023-01-13 13:44//)

3.

@无名啊,因为每行代码都return,所以可以安全的删除所有else。

// 只更新了行政区划代码,则按这个代码进行后续逻辑
if (new_addr == old_addr && new_code != old_code) {
    return new_code;
}
// 只更新了地址,则解析出地址对应的行政区划代码,再后续逻辑
if (new_addr != old_addr && new_code == old_code) {
    return parse(new_addr);
}
// 两者都没更新,则是来自 INSERT 触发器的(SQLite 不支持合并 INSERT UPDATE 触发器)
// 提供了行政区划代码,则优先使用,否则解析提供的地址
if (new_code == NULL) {
    return parse(new_addr);
}
return new_code;
(/@Ta/2023-01-13 15:29//)

4.

@旧人@寻梦xunm,挺不错的。8 种情况里,有 7 种都对了。

只有 new_addr != old_addr && new_code != old_code && new_code != NULL 时答案不对。

原逻辑结果应为 new_codeChatGPT 结果为 parse(new_addr)

(/@Ta/2023-01-13 20:32//)

5.

@老虎会游泳,对的,可以这样。

可能我觉得,一条 if 语句,可能会比,四条 if 语句,参与讨论的人多。。

(/@Ta/2023-01-13 20:35//)

6. 别问,问就问chatgpt
(/@Ta/2023-01-14 17:06//)

7.

@hik,现在还有啥不用注册就能使用的渠道嘛

(/@Ta/2023-01-14 20:14//)

8. @无名啊,chatgpt.sbaliyun.com。但最好还是官网,官网可以记忆上下文。
(/@Ta/2023-01-16 23:58//)

回复需要登录

11月16日 12:22 星期六

本站由hu60wap6华为CPU驱动

备案号: 京ICP备18041936号-1