2014-09-06 4 views
-1

Какая операция реализована здесь?Что это за C++-функция, выполняемая за обфускацией синтаксиса?

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

EDIT Он взят из теста экспертизы C++. Он не должен помогать никому или решать какие-либо проблемы. Просто ищем объяснение затушенного синтаксиса.

ответ

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 
2

Если *str не равен нулю, он вернет **str и приращает *str.
В противном случае он сбрасывает приращение и возвращает **str (который в этом случае будет равен нулю).

То есть вы можете использовать его, чтобы выскочить спереди *str, пока не достигнете нуля.

Переписывая функцию, которая будет меньше запутывается:

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

Пример: следующая программа печатает "Привет, мир!" по одному персонажу за раз.

#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; 
}