首页 > 解决方案 > 语法困难,意外输出

问题描述

你能告诉我为什么通过运行这两个代码我有不同的输出吗?

    void UART_OutString(unsigned char buffer[]){
    int i;
    while(buffer[i]){
        UART_OutChar(buffer[i]);
        i++;
    }
}

    void UART_OutString(unsigned char buffer[]){
  int i = 0;
  while(buffer[i]){
     UART_OutChar(buffer[i++]);
  }
}

问候, 格纳迪

标签: cgrammar

解决方案


您没有i在第一种情况下初始化变量,所以这是一个无趣的错字错误,您的编译器应该警告您...


话虽如此,我们可以应用KISS 原则并以最易读的方式重写整个代码,即 for 循环,从本质上讲,它很难忘记初始化循环迭代器:

void UART_OutString(const char* buf[]){
  for(int i=0; buf[i]!='\0'; i++){
     UART_OutChar(buffer[i]);
  }
}

事实证明,最易读的方式通常也是最快的方式。

(但是,int在某些低端系统上可能效率低下,所以如果您只使用长度为 255 或更短的字符串就可以了,那uint8_t i将是一个更好的选择。嵌入式系统永远不应该使用int这些stdint.h类型。)


推荐阅读