【问题标题】:what's the use of "?" and ":" in a function that has a pointer as argument? [duplicate]“?”有什么用?和“:”在以指针为参数的函数中? [复制]
【发布时间】:2023-03-27 02:54:01
【问题描述】:

今天我的老师教我们如何使用 C 中的指针来模拟这种编程语言的一些常见功能,他的一个例子是 rev_string 函数(如下所示),它是为了模拟原始的 strrev() 而创建的<string.h> 标头。

void rev_string(char *s)
{
    char *t;
    int counter = 0, middle, temp, i, j, last, begin;

    for (t = s; *t != '\0'; t++)
        counter++;

    middle = (counter % 2 == 0) ? (counter / 2) : ((counter - 1) / 2);
    j = counter - 1;
    for (i = 0; i < middle; i++)
    {
        last = s[j];
        begin = s[i];
        temp = last;
        s[j] = begin;
        s[i] = temp;
        j--;
    }
}

看了几遍上面的代码,我没弄明白middle变量里面声明的?:的用法。谁能解释一下为什么上面的代码中需要这些符号?

【问题讨论】:

  • 那你为什么不问老师?
  • if (counter % 2 == 0) middle = (counter / 2); else middle = (counter - 1) / 2;的快捷方式,名称为三元运算符。
  • 顺便说一下,这是一个非常无用的三元运算符示例。这是因为counter / 2 将被四舍五入。因此,如果counter 恰好是奇数,则不需要减去 1。因此counter % 2 测试相当无用。该行应为middle = counter / 2
  • 是什么让您认为它与指针参数有关?该语句中未使用传递的指针...
  • 显示的代码中不需要条件运算符。只要counter 是非负数,即防止过长字符串溢出,(counter % 2 == 0) ? (counter / 2) : ((counter - 1) / 2) 就等价于counter/2,它将counter 除以二并丢弃分数。除非讲师对此提出了一些特别的观点,或者以其他方式使用故意绘制的代码来说明某事,否则您可能遇到了一个糟糕的讲师。

标签: c pointers char header-files


【解决方案1】:

这是条件运算符。它是一个三元运算符,格式为“condition ? if-part : else-part”。

它评估它的第一部分。如果结果非零,则计算第二部分并成为表达式的结果,否则计算第三部分并成为表达式的结果。

所以这个:

middle = (counter % 2 == 0) ? (counter / 2) : ((counter - 1) / 2);

相当于:

if (counter % 2 == 0) {
    middle = (counter / 2);
} else {
    middle = ((counter - 1) / 2);
}

【讨论】:

  • 关于编辑:在规范中称为“条件运算符”,描述了它的作用。三元运算符是一个东西,而不是它的名字。我认为C只有一个,但其他语言有多个三元运算符。
  • 问题不问条件运算符是做什么的;它问为什么有必要。如果counter为非负数,则(counter % 2 == 0) ? (counter / 2) : ((counter - 1) / 2);等价于counter/2,所以不需要运算符。
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 2015-02-07
  • 2021-01-22
  • 2023-03-04
  • 2021-08-26
  • 2014-10-19
  • 2021-01-25
  • 2017-08-24
相关资源
最近更新 更多