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);
这些关于 &&
动作的东西叫做短路评估
确实很简单。
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);
这些关于 &&
动作的东西叫做短路评估