虽然循环不工作!

Ava*_*Ava 0 c++ reverse while-loop

using namespace std;

void reverse(char a[],int slen, int elen)
 {
     int start,end,temp;
     for(start=slen,end=elen;start<end;start++,end--)
            {
                temp=a[start];
                a[start]=a[end];
                a[end]=temp;
            }
 }

 void reverseall(char b[])
  {
      char a[15];
      int i,j,n=0,len;
      for(i=14,j=0;i>=0,j<15;i--,j++)
           a[j]=b[i];

      i=0;
      j=0;

      while(a[i]!='\0')
         {cout<<"h";
            n++;
            i++;
         }

      while(j!=n)
         {
            if(j!=0)
              j++;
            len=0;
            while(a[j]!= ' ' && a[j]!='\0')
             {
                len++;
                j++;
             }
            reverse(a,j-len,j-1);
         }

     for(i=0;i<n;i++)
        cout<<a[i];
  }
int main()
 {
     char b[20]="hi how are you";
     reverseall(b);
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

我修改了一个适当反转工作程序 ,只添加了3行,而while循环现在不能正常工作.

 for(i=14,j=0;i>=0,j<15;i--,j++)
               a[j]=b[i];

          i=0;
          j=0;  
Run Code Online (Sandbox Code Playgroud)

这是程序的链接,我希望输出为"你是多么喜欢".

谢谢.

fre*_*low 5

这种情况i>=0,j<15可能并不符合您的想法.首先,i>=0评估(无论是真还是假),然后丢弃结果,然后j<15评估并传递结果.也就是说,i>=0,j<15等同于j<15.你可能想要的是什么i>=0 && j<15.

请注意我如何用二元和运算符替换逗号运算符.通常,表达式a, b意味着首先评估a,然后评估b,后者的结果是整个表达式的结果.除非评估a副作用(例如修改变量),否则这是无稽之谈.任何理智的编译器都会在这里警告你,如果你提高警告级别,你应该几乎总是这样做.

表达a && b意味着首先评估a.如果是假,结果a && b也是假的.否则,b进行评估,结果是整个表达式的结果.也就是说,表达a && b如果两个仅评估为真a,并b进行评估,以正确的.请注意,b如果a已经为假,则根本不进行评估,因为无论具有什么值b,它都不可能再影响结果.这种行为称为短路评估.