zoukankan      html  css  js  c++  java
  • while 循环

    1 while(condition)
    2 {
    3     //........
    4 }

    循环在我们从事C语言开发的过程中可以说用的挺多的,但是今天想起了一个问题,源于我要在一个长字符串中查找特定字符串,于是我写了如下代码:

     1 int main()
     2 {
     3     int index = 0;
     4     while(index < UART_RXBUF_SIZE)
     5     {
     6         if(buf[index++] == 'o')
     7         {
     8             if(buf[index++] == 'p')
     9             {
    10                 if(buf[index++] == 'e')
    11                 {
    12                     if(buf[index++] == 'n')
    13                     {
    14                      printf("TRUE!
    ");
    15                       return 1;
    16                     }
    17                 }
    18             }
    19             
    20         }
    21     }
    22     printf("FALSE!
    ");
    23     return 0;
    24 }

    但是我发现这会存在访问数组越界的问题。比如buf里最后一个字符是‘o’,那么程序就会访问buf[UART_RXBUF_SIZE],这显然越界了。

    但是这时我想:while循环会不断检测溢出吗?比如会检测环境是否正常,如果发现不正常则产生中断,自动退出,以至于不会发生段错误。经过测试,while循环并不会这么做,测试如下:

     1 int arry[8] = {0,1,2,3,4,5,6,7};
     2 
     3 int main()
     4 {
     5     int i = 6;
     6     while(i < UART_RXBUF_SIZE)
     7     {
     8         i++;
     9         printf("%d
    ",i);
    10         i++;
    11         printf("%d
    ",i);
    12         i++;
    13         printf("%d
    ",i);
    14         i++;
    15         printf("%d
    ",i);
    16         printf("%d
    ",arry[i]);
    17     }
    18 }

    其中i可取7、 8。所以我很好奇各种编译器对此的处理方式是怎么样的?(在VC6.0中上面程序最后输出为0)。

    所以此文提到的查找字符串的代码中,要加入数组越界访问的条件。

    当你坚持做一件完全正确的事情,有可能在很长一段时间内,你的价值都是零。
  • 相关阅读:
    SQL SERVER 2012修改数据库名称(包括 db.mdf 名称的修改)
    vmware三种网络模式
    指针
    linux 中 开放端口,以及防火墙的相关命令
    数据库备份的脚本,记录下,还需优化下
    遍历 目录的几种有效办法
    转。git 乌龟的使用安装
    centos 时区正确,时间不对
    locate
    从 零开始 无差错 装好nginx+PHP
  • 原文地址:https://www.cnblogs.com/lweleven/p/while.html
Copyright © 2011-2022 走看看