繁体   English   中英

C. 带字符的 for 循环

[英]C. for loop with chars

你能解释一下这些输出吗?

1)

char s[]="TvNnFs",*p;
for(p=&s[5];p>=s;p--) 
    --*p;
puts(s);

SuMmErSuMmEr

2)

char s[]="TvNnFs",*p;
for(p=&s[5]; p>=s; p--) 
    ((--*p)<'a') ? (*p+=('a'-'A')) : (*p);
puts(s);

输出:夏天

char s[]="TvNnFs",*p;

其中s是字符数组, p是字符指针,如下所示

 s[0]  s[1]   s[2]  s[3]  s[4]  s[5]  s[6]
  ------------------------------------------
 |  T  |  v  |  N  |  n  |  F  |  s  |  \0  |
  ------------------------------------------
 s 0x100 0x101 0x102 0x103 0x104 0x105 0x106.. (assume 0x100 is base address of s)

接下来, for循环

for(p=&s[5];p>=s;p--) 
    --*p;

这里p=&s[5]的指针p指向的地址s[5]0x105 接下来是p>=s ie 0x105 >= 0x100这是真的,然后--*p执行即第一个*p ,这意味着0x105内存位置的值是s并且递减将使s[5]作为r

现在 char 数组s看起来像

 s[0]  s[1]   s[2]  s[3]  s[4]  s[5]  s[6]
  ---------------------------------------------
 |  T  |  v  |  N  |  n  |  F  |  r(new)|  \0  |
  ---------------------------------------------
 s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..

注意:您可能有兴趣知道通过执行--*p s如何受到影响? 这是因为p指向或持有s的地址,即在*p上所做的任何更改都会间接影响s

p--发生之后,即p现在指向比之前更早的一个位置,即0x104 相同的操作将发生,直到p到达s0x100 >= 0x100 最后 char 数组s看起来像

      s[0]  s[1]   s[2]  s[3]  s[4]  s[5]  s[6]
      -------------------------------------------
     |  S  |  u  |  M  |  m  |  E  |  r  |  \0  |
      -------------------------------------------
     s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..

因此它打印SuMmEr

案例2:

char s[]="TvNnFs",*p;
for(p=&s[5]; p>=s; p--) 
((--*p)<'a')?(*p+=('a'-'A')):(*p);
puts(s);

这里

       s[0]  s[1]   s[2]  s[3]  s[4]  s[5]  s[6]
      ------------------------------------------
     |  T  |  v  |  N  |  n  |  F  |  s  |  \0  |
      ------------------------------------------
     s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..
                                      |
                                      p points here

对于0x105 >= 0x100 :这个

((--*p)<'a')?(*p+=('a'-'A')):(*p);

是三元运算符,即首先((--*p)<'a')执行,如果结果为真,则(*p+=('a'-'A'))将是输出 else (*p) 所以在这里它看起来像((--*p)<'a') ie 'r' < 'a'这是错误的所以只是(*p)s[5]在此之后由于--*p发生了变化。

      s[0]  s[1]   s[2]  s[3]  s[4]  s[5]  s[6]
      ------------------------------------------
     |  T  |  v  |  N  |  n  |  F  |  r  |  \0  |
      ------------------------------------------
     s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..
                                | 
                                p points here due to p--

接下来,对于0x104 >= 0x100 :这个

((--*p)<'a')?(*p+=('a'-'A')):(*p);

'E' < 'a'70 < 97这是真的,所以这个(*p+=('a'-'A'))得到执行即

*p = *p + ('a' - 'A')
   = 'E' + (97 - 65)
   = 'E' + 32
*p = 'e' /* now s[4] overwritten by e(previously F) */

现在数组看起来像

   s[0]  s[1]   s[2]  s[3]  s[4]  s[5]  s[6]
  ------------------------------------------
 |  T  |  v  |  N  |  n  |  e  |  r  |  \0  |
  ------------------------------------------
 s 0x100 0x101 0x102 0x103 0x104 0x105 0x106..
                      | 
                      p points here due to p--

相同的操作一直持续到0x100 >= 0x100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM