这里实施了哪些操作?
char char_func(char **str) {
char c;
return ((c=*((*str)++))?c:*(--(*str)));
}
编辑它取自C ++考试。它不应该帮助任何人或解决任何问题。只是寻找混淆语法背后的解释。
答案 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;
}