C简单提问 求解为什么输出是 faavrhee

#include
int main(void)
{
char str1 [] = "gawsie";
char *ps;

for (ps = str1; *ps != '\0'; ps++)
{
    if (*ps =='a' || *ps == 'e')
    putchar(*ps);
    else
    (*ps)--;
    putchar(*ps);              //为什么输出是 faavrhee 
}
getchar();
return 0;

不等于a g-- 就是f 等于a输出两次a w-- 是v s--是r i--是h 等于e输出两次e 这不就是你的程序写的意思吗!

(*ps)-- (*ps)是当前字母.每个字母都有其对应的ASCII码 g对应的ASCII是119 减一就是118 代表字符f 这关系到编译器内部如何处理转换的问题 O(∩_∩)O

  #include<iostream>
#include<stdio.h>
#include <fstream>
using namespace std;

int main(void)
{
    char str1 [] = "gawsie";
    char *ps;
    for (ps = str1; *ps != '\0'; ps++)
    {
        if (*ps =='a' || *ps == 'e')
            putchar(*ps);
        else
        {
            (*ps)--;
            putchar(*ps);              //为什么输出是 faavrhee 
        }
    }
    getchar();
    return 0;
}

else 记得加括号

#include
int main(void)
{
char str1 [] = "gawsie";
char *ps;

for (ps = str1; *ps != '\0'; ps++)                                                                                                           
{
     if (*ps =='a' || *ps == 'e')
            putchar(*ps); 
     else
            (*ps)--;
     putchar(*ps); 
 }   
 getchar();
 return 0;

}

可以跟着你的代码走一次就知道了,缩进一下你的代码也可以发现你为什么会输入两次a和e
第一次进入循环时,*ps=’g’,此时会进入else执行*ps = *ps-1,那么此时*ps=’f’,(ps:参考26个英文字母表顺序) ,else走完后执行getchar(),输出f
第二次进入循环时,*ps=’a’,进入if,执行getchar()输出a,向下执行又遇到putchar(),再次输出a
第三次进入循环时,*ps=’w’,与第一次相同,输出一次v
第四次进入循环时,*ps=’s’,与第一次相同,输出一次r
第五次进入循环时,*ps=’i’,与第一次相同,输出一次h
第六次进入循环时,*ps=’e’,与第二次相同,输出两次e

你的代码应该是这样的. 上面的哥们括号给你加错了.


#include<iostream>
#include<stdio.h>
#include <fstream>
using namespace std;

int main(void)
{
    char str1 [] = "gawsie";
    char *ps;

    for (ps = str1; *ps != '\0'; ps++) {

        if (*ps == 'a' || *ps == 'e') {
            putchar(*ps);
        }
        else {
            (*ps)--;
        }
        putchar(*ps);              //为什么输出是 faavrhee
    }

    getchar();

    return 0;
}

@xianxujiang 说的是对的

你代码习惯很不好,而且你可以试着打断点,然后单步调试,就不需要问这个问题了.....