Post 如果条件为真,则在 do while 循环中递增(最好的方法?)

Post Increment in do while loop if condition is TRUE (BEST WAY?)

确实很简单。

int main()
{
    int n,i,j;
    n = 20;
    i = 0;
    char ch[8];

    do
    {
        ch[i] = (n%2) + '0';
        n /= 2;
        // SIMPLE WAY
        if(n != 0)
            i++;
    }
    while(n != 0);

    for(j=0; j<=i; j++)
    {
        printf("%c",ch[i-j]);
    }

    return 0;
}

但我不喜欢这样

我试过下面的方法,但代码不好

int main()
{
    int n,i,j;
    n = 20;
    i = 0;
    char ch[8];

    do
    {
        ch[i] = (n%2) + '0';
        n /= 2;
    }
    while(n != 0 && i++); // THIS

    for(j=0; j<=i; j++)
    {
        printf("%c",ch[i-j]);
    }

    return 0;
}

如何使用BEST WAY只在循环为真时才增加值? 或者只是更正第二种方式 while(n != 0 && i++)

好吧,你总是可以这样做:

do {
   // code
} while(n != 0 && ++i);

这样,i&& 的第一部分评估为 True 之后立即递增,并且 && 应用于 n != 0 和 [ 的更新版本=11=].

How to get the value incremented only when the loop is true with BEST WAY?
OR just correct 2nd way while(n != 0 && i++)

我不推荐这两种方法。

不需要特殊测试来查看代码是否应该递增 i

do {
  ch[i] = (n%2) + '0';
  n /= 2;
  i++;
} while(n != 0);
// Just decrement after the loop
i--;

for(j=0; j<=i; j++) {
    printf("%c",ch[i-j]);
}

或者根本不递减

do {
  ch[i] = (n%2) + '0';
  n /= 2;
  i++;
} while(n != 0);

for(j=0; j<i; j++) {
  printf("%c",ch[i-1-j]);
}

或使用 do ... while 打印。

do {
  ch[i++] = (n%2) + '0';
  n /= 2;
} while(n);

do {
  printf("%c",ch[--i]);
} while (i);

备注:

char ch[8]; 对于超出范围 [-255 ... 255]int 来说太小了。对于 32 位 int,使用 char ch[32]; 或更宽的范围。一般来说,使用 char ch[sizeof(int) * CHAR_BIT];

ch[i] = (n%2) + '0';肯定会在n < 0时出现意想不到的结果。请考虑 unsigned 类型。

可以这样:

int n = 20;
int i = 7;
char ch[] = "00000000";
while (n) // if n already = 0 then do nothing
{
    ch[i--] = (n % 2) + '0'; // assign then increment
    n /= 2;                // shift to right same as n >>= 1;
}
printf ("%08s", ch);

在 C++ 中,您可能会这样做:

std::cout << std::bitset<8>(n); // 00010100 for n = 20

如果领先 0 没问题。

do
{ .......... }while(n && i++ ? 1 : n);

这些关于 && 动作的东西叫做短路评估