【问题标题】:What does "return p ? memcpy(p, s, len) : NULL;" mean?“返回 p ? memcpy(p, s, len) : NULL;”是什么意思?意思是?
【发布时间】:2014-09-21 05:30:44
【问题描述】:

下面代码中的“return p?memcpy(p, s, len) : NULL;”是什么意思? (更一般地说,什么是条件运算符,a ? b : c?)

char * strdup(const char * s)
{
  size_t len = 1+strlen(s);
  char *p = malloc(len);

  return p ? memcpy(p, s, len) : NULL;
}

【问题讨论】:

  • 请澄清该表达的哪一部分让您感到困惑。那里发生了很多事情。
  • @DavidGrayson:它在标题中......以及问题中的第一个也是唯一一个句子。 OP如何更清楚?是的。
  • @EdS。也许OP只是不知道三元运算符是什么。也许他不知道如何返回 memcpy。这是一个合理的担忧
  • 我们都在猜测他不知道三元运算符是什么,但可能他实际上对returnNULLmemcpy 感到困惑。他应该告诉我们。
  • 我的问题是关于“三元运算符”,谢谢大家:)

标签: c ternary-operator conditional-operator


【解决方案1】:

这种语法称为三元运算符,您可以将其视为简化的 if 语句。 return p ? memcpy(p, s, len) : NULL; 等同于:

if(p)
    return memcpy(p, s, len);
else
    return NULL;

memcpy() 函数返回一个指向 dest 的指针,这是 memcpy 的第一个参数,在你的例子中是 p。因此,如果 p 的值不同于 0(指针不为 NULL),则返回该指针。否则,返回 NULL。

【讨论】:

    【解决方案2】:

    表示执行并返回memcpy(p, s, len),除非p==0。如果p==0,它将返回NULL,并且执行memcpy(p, s, len)

    阅读https://en.wikipedia.org/wiki/%3F:#C了解更多信息。

    另外,套用http://man7.org/linux/man-pages/man3/memcpy.3.html: memcpy() 函数将 len 个字节从内存区域 p 复制到内存区域 s。内存区域不得重叠。

    也就是说,如果我们有以下记忆:

       p            s
    [][1][2][3][][][4][5][6][]
    

    和 len == 3,那么当 memcpy 被调用时,我们得到:

       p            s
    [][1][2][3][][][1][2][3][]
    

    最后,一个函数返回的值就是你在表达式中使用它时的结果;如果foo() 返回 5,则print(foo()); 打印 5。

    【讨论】:

      【解决方案3】:

      这是 C 语言中的三元运算符。

      p ? memcpy(p, s, len) : NULL;
      

      表示如果第一个条件为真,即p,则返回memcpy(p, s, len)的值,否则返回NULL

      【讨论】:

      • if the first condition is true ie, "memcpy(p, s, len)" is true then return the value of "memcpy(p, s, len)" 不应该是if the first condition is true ie, "p" then return the value of "memcpy(p, s, len)" 吗? (忽略其他语法问题)
      • @Jashaszun:- 是的,更新了我的答案。谢谢指正!
      • 另请注意,最后两个表达式中只有一个被求值,这会产生重大影响。
      • @RT 我错过了您编辑撤消我的反对票后的这段时间。如果您愿意,您可以编辑您的答案,以便我撤消然后重新编辑它吗?
      • @Jashaszun:- 我喜欢你的精神。谢谢+1
      猜你喜欢
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2020-05-14
      • 2011-08-31
      • 2015-03-26
      相关资源
      最近更新 更多