【问题标题】:Conditionally set a variable if it's NULL有条件地设置一个变量,如果它是 NULL
【发布时间】:2013-02-13 19:20:21
【问题描述】:

在单步执行sqlite3_stmt 时,我想检查NULL 的返回值,而不是存储它并检查存储的值。

这是我现在正在做的事情:

char *email = (char *)sqlite3_column_text(statement, 10);
if (email == NULL) email = "";

这是我喜欢要做的事情,减去对column的双重调用:

char *email = ((char *)sqlite3_column_text(statement, 10)) ? (char *)sqlite3_column_text(statement, 10) : "";

有什么方法可以更简洁地表达第二个表达式吗?我必须重复做很多这些,所以我在寻找简洁。

我知道这是控制流的问题,而不是 SQLite API 本身的问题,但是你有它。我想不出这样做的好方法。

【问题讨论】:

  • 还有必须关于这个的另一个问题,但我就是找不到。

标签: c variable-assignment conditional-operator


【解决方案1】:

GNU extension to C 允许三元条件运算符评估其条件是否为真并且第一个分支中没有任何内容:

char *email = (char *)sqlite3_column_text(statement, 10);
email = email ? : "";

或者,更确切地说,你说你在找什么

char * email = (char *)sqlite3_column_text(statement, 10) ? : "";

这在使用 Clang 编译时也有效。

另一种可能是:

char *email = (char *)sqlite3_column_text(statement, 10);
email = (NULL == email) ? email : "";

但我认为我建议您选择您的第一个选项。如果您经常这样做,请制作一个代码 sn-p。

【讨论】:

  • 这是一个非常方便的扩展。你有它的文档链接吗?
  • @RichardJ.RossIII:添加到我的帖子中。
  • 哇,这个问题有很多活动。 @JoshCaswell,在看到您最初的回复后,我最终使用了 char *email = (char *)sqlite3_column_text(statement, 10) ? : "";,这就是您在上面的编辑中最终所说的。谢谢!
【解决方案2】:

这行得通吗?

char *email;
// Reviewed by "R." to verify sequence point correctness.
email = (email = (char *)sqlite3_column_text(statement, 10))? email : "";

【讨论】:

  • 我会避免这样做,因为当我看到它时,我花了至少 30 秒来验证没有违反序列点规则。那是在浪费读者的时间。
  • (那里,我修好了……所以下一位读者不必花 30 秒重新验证)
  • 哈哈好吧 +1 让我发笑。
  • 它可能会,但我必须同意我在遵循它时遇到了麻烦。事实上,即使是上面的解决方案也可能会在六周后重新咬我......
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2021-09-18
  • 2016-12-12
  • 2011-02-10
  • 2014-11-17
相关资源
最近更新 更多