user-0 提问: while ，do while，for，循环的区别，求解答

回复:
user: user-1
content: 引用 25 楼 qq_36639412 的回复:[quote=引用 19 楼 hongwenjun 的回复:] char* csTrim_v2(char* cs) {     char* ret = cs;     char* pc = new char[strlen(cs) + 1];      int pos = strspn(cs , "\t \n");     // 查找非空白处pos     strcpy(pc , cs + pos);      char* end = pc;     while (*end++)     // 找到字符串末位的'\0'，         ;              // 因为上面 end++，实际指针在 '\0'的后一个     end -= 2;          // 所以退2格，回到字符串最后一个字母      while (*end == ' ' || *end == '\t' ||  *end == '\n') {         *end-- = '\0';     }     strcpy(cs , pc);      delete[] pc;     return ret; }   char* cs_strrev(char* string) {     char* start = string;     char* left = string;     char ch;      while (*string++) // 找到string 末位的'\0'，         ;             // 因为上面 string++，实际指针在 '\0'的后一个     string -= 2;      // 所以退2格，回到字符串最后一个字母     while (left < string) {         ch = *left;    // 通过临时变量 ch 进行交换         *left++ = *string;         *string-- = ch;     }     return(start); } 使用 while 可以把代码写的简短。  /*-----------------------------------------------*/ 使用  for  可以方便表示一个区间 遍历    // iterate foo: inserting into bar   for (auto it = std::begin(foo); it!=std::end(foo); ++it)     bar.push_back(*it);    // iterate bar: print contents:   std::cout << "bar contains:";   for (auto it = std::begin(bar); it!=std::end(bar); ++it)     std::cout << ' ' << *it;   std::cout << '\n';  while，do whil是不是先算表达式如果为真再执行语句，最后I++?还是i++在哪就算哪？[/quote]  while先计算 do while最后算 是的

user: user-0
content: 引用 19 楼 hongwenjun 的回复:char* csTrim_v2(char* cs) {     char* ret = cs;     char* pc = new char[strlen(cs) + 1];      int pos = strspn(cs , "\t \n");     // 查找非空白处pos     strcpy(pc , cs + pos);      char* end = pc;     while (*end++)     // 找到字符串末位的'\0'，         ;              // 因为上面 end++，实际指针在 '\0'的后一个     end -= 2;          // 所以退2格，回到字符串最后一个字母      while (*end == ' ' || *end == '\t' ||  *end == '\n') {         *end-- = '\0';     }     strcpy(cs , pc);      delete[] pc;     return ret; }   char* cs_strrev(char* string) {     char* start = string;     char* left = string;     char ch;      while (*string++) // 找到string 末位的'\0'，         ;             // 因为上面 string++，实际指针在 '\0'的后一个     string -= 2;      // 所以退2格，回到字符串最后一个字母     while (left < string) {         ch = *left;    // 通过临时变量 ch 进行交换         *left++ = *string;         *string-- = ch;     }     return(start); } 使用 while 可以把代码写的简短。  /*-----------------------------------------------*/ 使用  for  可以方便表示一个区间 遍历    // iterate foo: inserting into bar   for (auto it = std::begin(foo); it!=std::end(foo); ++it)     bar.push_back(*it);    // iterate bar: print contents:   std::cout << "bar contains:";   for (auto it = std::begin(bar); it!=std::end(bar); ++it)     std::cout << ' ' << *it;   std::cout << '\n';  while，do whil是不是先算表达式如果为真再执行语句，最后I++?还是i++在哪就算哪？

user: user-0
content: 引用 20 楼 zhu339111520 的回复:看楼上长篇大论的，实际上有个叼区别，毛区别都没得，随便你用啥，具体看业务  一般情况下线程执行的时候用while循环，遍历固定的数的时候用for循环，do...while写了这么多年代码从来没用过 先算表达式、语句、再I++？是不是这种顺序

user: user-0
content: 引用 22 楼 paschen 的回复:[quote=引用 21 楼 qq_36639412 的回复:] [quote=引用 17 楼 paschen 的回复:] [quote=引用 16 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？[/quote]  没有while (i<=100；i++)这种用法，建议楼主先把基础打好了[/quote] 意思就是说这些i++最后算还是左到右，上到下顺序，[/quote]  没有while (i<=100；i++)这种用法，你可以写成：  while (i<=100) {   //.........   i++; }[/quote] 先算表达式然后语句再i++?

user: user-1
content: 引用 21 楼 qq_36639412 的回复:[quote=引用 17 楼 paschen 的回复:] [quote=引用 16 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？[/quote]  没有while (i<=100；i++)这种用法，建议楼主先把基础打好了[/quote] 意思就是说这些i++最后算还是左到右，上到下顺序，[/quote]  没有while (i<=100；i++)这种用法，你可以写成：  while (i<=100) {   //.........   i++; }

user: user-0
content: 引用 17 楼 paschen 的回复:[quote=引用 16 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？[/quote]  没有while (i<=100；i++)这种用法，建议楼主先把基础打好了[/quote] 意思就是说这些i++最后算还是左到右，上到下顺序，

user: user-1
content: 引用 11 楼 qq_36639412 的回复:[quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦

user: user-2
content: 理解和讨论之前请先学会如何观察！

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-3
content: 看楼上长篇大论的，实际上有个叼区别，毛区别都没得，随便你用啥，具体看业务  一般情况下线程执行的时候用while循环，遍历固定的数的时候用for循环，do...while写了这么多年代码从来没用过

user: user-4
content: char* csTrim_v2(char* cs) {     char* ret = cs;     char* pc = new char[strlen(cs) + 1];      int pos = strspn(cs , "\t \n");     // 查找非空白处pos     strcpy(pc , cs + pos);      char* end = pc;     while (*end++)     // 找到字符串末位的'\0'，         ;              // 因为上面 end++，实际指针在 '\0'的后一个     end -= 2;          // 所以退2格，回到字符串最后一个字母      while (*end == ' ' || *end == '\t' ||  *end == '\n') {         *end-- = '\0';     }     strcpy(cs , pc);      delete[] pc;     return ret; }   char* cs_strrev(char* string) {     char* start = string;     char* left = string;     char ch;      while (*string++) // 找到string 末位的'\0'，         ;             // 因为上面 string++，实际指针在 '\0'的后一个     string -= 2;      // 所以退2格，回到字符串最后一个字母     while (left < string) {         ch = *left;    // 通过临时变量 ch 进行交换         *left++ = *string;         *string-- = ch;     }     return(start); } 使用 while 可以把代码写的简短。  /*-----------------------------------------------*/ 使用  for  可以方便表示一个区间 遍历    // iterate foo: inserting into bar   for (auto it = std::begin(foo); it!=std::end(foo); ++it)     bar.push_back(*it);    // iterate bar: print contents:   std::cout << "bar contains:";   for (auto it = std::begin(bar); it!=std::end(bar); ++it)     std::cout << ' ' << *it;   std::cout << '\n';

user: user-4
content: 使用 while 可以把代码写的简短。 使用  for  可以方便表示一个区间 遍历 do  好像不太好看

user: user-1
content: 引用 16 楼 qq_36639412 的回复:[quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？[/quote]  没有while (i<=100；i++)这种用法，建议楼主先把基础打好了

user: user-0
content: 引用 2 楼 paschen 的回复:for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 I++怎么算，for比较好理解是固定表达式，最后算i++，while， do while怎么算过程顺序，I++什么时候算，  引用 15 楼 paschen 的回复:[quote=引用 11 楼 qq_36639412 的回复:] [quote=引用 2 楼 paschen 的回复:] for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？[/quote]  while，do while中你把i++放哪就在哪计算啦[/quote] 比如int i=0,j=1,sum; while (i<=100；i++) { sum=i+j; printf("%d\n",j); 这个位置的j++怎么算的？

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }  不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。  整数I++表达式的类型怎么算，for是固定表达式，最后算I++,for比较好理解，那while ，do while怎么算I++的顺序

user: user-0
content: 引用 2 楼 paschen 的回复:for (表达式1;表达式2;表达式3)  {    循环体语句 }  for语句执行过程： （1） 计算表达式1的值； （2） 计算表达式2的值，若表达式的值为真（或非0），则执行循环体； （3） 计算表达式3的值； （4） 再次计算表达式2的值，并重复以上过程； （5） 直到表达式2的值为假（或为0），则结束该循环。 表达式I++应该怎么算，for是固定值表达式最后算i++，while，do while呢？

user: user-0
content: 引用 1 楼 shihengzhen101 的回复:给你写个等价的语句吧，你对比一下就明白了，执行顺序是一样的，就是求1到10的和，结果放到变量sum中  while循环  	int num = 1; 	int sum = 0; 	while(num <= 10) 	{ 		sum = sum + num;                 ++num； 	} 	printf("%d\n", sum);   do while循环  	int num = 1; 	int sum = 0; 	do 	{ 		sum = sum + num; 		++num; 	}while(num <= 10)  	printf("%d\n", sum);   for循环  	int num = 1; 	int sum = 0; 	for (num = 1; num <= 10; ++num) 	{ 		sum = sum + num; 	} 	printf("%d\n", sum);   执行步骤都是一样的，你对比一下就好 那关于I++，for比较好理解是固定表达式1，2表达式，语句，3就是最后算I++,                    while，do while，怎么算I++的？

user: user-5
content: 引用 8 楼 qq_36639412 的回复:[quote=引用 1 楼 shihengzhen101 的回复:] 给你写个等价的语句吧，你对比一下就明白了，执行顺序是一样的，就是求1到10的和，结果放到变量sum中  while循环  	int num = 1; 	int sum = 0; 	while(num <= 10) 	{ 		sum = sum + num;                 ++num； 	} 	printf("%d\n", sum);   do while循环  	int num = 1; 	int sum = 0; 	do 	{ 		sum = sum + num; 		++num; 	}while(num <= 10)  	printf("%d\n", sum);   for循环  	int num = 1; 	int sum = 0; 	for (num = 1; num <= 10; ++num) 	{ 		sum = sum + num; 	} 	printf("%d\n", sum);   执行步骤都是一样的，你对比一下就好 谢了，现在分类比之前清晰一些了，while先执行循环控制条件表达式，在执行循环体语句，do while就是反过来，先循环体语句，所以至少执行一次，再执行条件表达式，for就是表达式1、2、3，循环初始化、循环条件、循环赋值，[/quote]  嗯嗯，就是这个意思

user: user-0
content: 引用 1 楼 shihengzhen101 的回复:给你写个等价的语句吧，你对比一下就明白了，执行顺序是一样的，就是求1到10的和，结果放到变量sum中  while循环  	int num = 1; 	int sum = 0; 	while(num <= 10) 	{ 		sum = sum + num;                 ++num； 	} 	printf("%d\n", sum);   do while循环  	int num = 1; 	int sum = 0; 	do 	{ 		sum = sum + num; 		++num; 	}while(num <= 10)  	printf("%d\n", sum);   for循环  	int num = 1; 	int sum = 0; 	for (num = 1; num <= 10; ++num) 	{ 		sum = sum + num; 	} 	printf("%d\n", sum);   执行步骤都是一样的，你对比一下就好 谢了，现在分类比之前清晰一些了，while先执行循环控制条件表达式，在执行循环体语句，do while就是反过来，先循环体语句，所以至少执行一次，再执行条件表达式，for就是表达式1、2、3，循环初始化、循环条件、循环赋值，

user: user-6
content: 本质上没区别，不同写法。