【问题标题】:Why the output of this C program is zero?为什么这个 C 程序的输出为零?
【发布时间】:2017-01-19 10:40:48
【问题描述】:

谁能详细解释这段代码以及为什么会出现 0?

源代码:

#include<stdio.h>
void main(){
char *str="Hello";
char *ptr = str;
char least =127;
while (*ptr++)
    least = ((*ptr)<(least))?(*ptr):(least);
printf("%d", least);
}

输出:

0

【问题讨论】:

标签: c string pointers output


【解决方案1】:

您似乎正在尝试在字符串中查找最小的 ASCII 值。

您的代码的问题是while() 循环忽略了字符串的第一个字节,而是查看'\0' 字符串结束标记。您想要做的是退出循环您将least 与零进行比较。

试试这个:

while (*ptr) {
    least = ((*ptr)<(least))?(*ptr):(least);
    ptr++;
}

【讨论】:

  • 实际上,这是一篇论文中的 MCQ 类型的问题,并要求输出。当我在我的机器上运行它时,我开始知道答案,但我不知道它是怎么来的。这就是我请你解释的原因。
【解决方案2】:

你所有的问题都是由混淆引起的——试图编写一个尽可能复杂的简单算法(糟糕的编程)。这不仅会导致上述错误,还会降低可读性和性能。

如果您尝试尽可能简单地编写简单算法(良好的编程),就不会出现问题,代码也会执行得更快:

#include <stdio.h>
#include <limits.h>

int main (void)
{
  const char* str="Hello";
  char least = CHAR_MAX;

  for(size_t i=0; str[i] != '\0'; i++)
  {
    if(str[i] < least)
    {
      least = str[i];
    }
  }

  printf("%c = %d", least, least);
}

【讨论】:

  • 实际上,这是一篇论文中的 MCQ 类型的问题,并要求输出。当我在我的机器上运行它时,我开始知道答案,但我不知道它是怎么来的。这就是我请你解释的原因。
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2022-11-16
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
相关资源
最近更新 更多