这个C ++函数在混淆语法背后做了什么?

时间:2014-09-06 16:05:10

标签: c++

这里实施了哪些操作?

   char char_func(char **str) {
      char c; 
      return ((c=*((*str)++))?c:*(--(*str)));
    }

编辑它取自C ++考试。它不应该帮助任何人或解决任何问题。只是寻找混淆语法背后的解释。

2 个答案:

答案 0 :(得分:4)

与:

相同
char char_func(char** ptr)
{
    char c = **ptr;       // read the current character (pointed by ptr)
    (*ptr)++;             // move the original pointer (ptr) to next character
    if (c != '\0')        // if the character in c is not the one ending the sequence
    {
        return c;         // return that character
    }
    else                  // otherwise
    {
        --(*ptr);         // move the original pointer back one step (back to '\0')
        return **ptr;     // return that last '\0' character
    }
}

表示每次后续调用都会返回作为参数传递的字符串的下一个字符(字符'序列),直到遇到字符\0为止(然后它反复返回\0个字符):

int main()
{
    char tab[] = { 'a', 'b', 'c', '\0' };

    char* ptr = tab;                     

    printf("%c ", char_func(&ptr));      //  a  b  c  \0
                                         //  ^  
    printf("%c ", char_func(&ptr));      //  a  b  c  \0
                                         //     ^  
    printf("%c ", char_func(&ptr));      //  a  b  c  \0
                                         //        ^   
    printf("%c ", char_func(&ptr));      //  a  b  c  \0
                                         //            ^
    printf("%c ", char_func(&ptr));      //  a  b  c  \0
                                         //            ^       ^=ptr
    return 0;
}

输出:

a b c \0 \0

答案 1 :(得分:2)

如果*str不为零,则会返回**str并递增*str
否则,它会重置增量并返回**str(在这种情况下将为零)。

也就是说,您可以使用它弹出*str的正面,直到您达到零。

重写函数以减少混淆:

char char_func(char **str) {
   char c = str[0][0];
   if (c)
      str[0] += 1;
   return c;
}

示例:以下程序打印" Hello,world!"一次一个角色。

#include <iostream>

char char_func(char **str) {
   char c; 
   return ((c=*((*str)++))?c:*(--(*str)));
}

int main() {

   char test[] = "Hello, world!";
   char* t = test;
   for (char c = char_func(&t); c; c = char_func(&t))
      std::cout << c;
}