【发布时间】: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