C语言do while问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言do while问题相关的知识,希望对你有一定的参考价值。

#include <stdio.h>int main() int flag ; printf("请输入flag的值:"); scanf("%d",&flag); do printf("1\n"); printf("2\n"); printf("3\n"); printf("4\n"); flag++; while (flag < 5); printf("flag值大于或等于5,跳出while语句",flag); return 0;为什么输入>=5的值还是会运行一次大括号内的循环?程序应该是先做判断,判断为真时执行大括号内的循环,条件为假时就跳出循环的吗?输入>=5的值时明显是条件为真,为什么还会再执行一次呢?
#include <stdio.h>
int main()

int flag ;
printf("请输入flag的值:");
scanf("%d",&flag);
do printf("1\n");
printf("2\n");
printf("3\n");
printf("4\n");
flag++;

while (flag < 5);
printf("flag值大于或等于5,跳出while语句",flag); return 0;

为什么输入>=5的值还是会运行一次大括号内的循环?程序应该是先做判断,判断为真时执行大括号内的循环,条件为假时就跳出循环的吗?输入>=5的值时明显是条件为真,为什么还会再执行一次呢?

do ... while (...) 这种循环结构,就是不管循环条件如何,大括号里面的代码都一定会至少执行一次。

while(...) ... 这种结构才是先判断循环条件再决定要不要执行大括号里面的代码。

区别就在于前者是把条件放在后面的(就好比商场里的食品先让你试吃,再来决定要不要买,也就是说即使最终没买,那你也至少吃了一次了),后者则是把条件放在前面的(就好比电影院要验票才让你进去,没票的话就只能干瞪眼了)。

参考技术A do
while的与while不同之处在于其要先执行一次do中的语句,
所以y初始值为10
第一次do
y--;

y=9,
然后while(--y);

y=8,
第二次do
y--;
y=7,
然后while(--y);
y=6,
第三次do
y--;
y=5,
然后while(--y);
y=4,
第四次do
y--;
y=3,
然后while(--y);
y=2,
第五次do
y--;
y=1,
然后while(--y);
y=0
此时y=0,所以循环终止
然后输出y--
然而y--是“--“在后
,所以先用于显示,后执行加减,所以输出0
所以选D
参考技术B 首先你输入的是11,对吧?
然后程序走do
while
循环,进入大括号
sum的值变为15,然后i++,i
变成了
12,最后判断while条件,因为12已经不小于等于10,所以推出循环,最后打印sum的值,自然是15
!
知道了吗?
参考技术C 对输入字符运用逐个判断,
while(!="\n")像你这样已经是一个错误了,你对什么进行判断也没有说清楚

C 语言宏定义中使用do...while

 最近看到C语言的项目中在宏定义中使用了do...while(0),感到是个知识点,特来总结。

 先看这句话:do{...}while(0)在C中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果。这句话的意思是说,在宏定义中使用do...while(0)包含的所有语句是一个代码块,不会受到{};的影响。

看一个例子:

#include <stdio.h>
#include <stdlib.h>
#define TEST(p)                                     do                                          {                                               if(p!=NULL)                                 {                                               free(p);                                    printf("free success!\n");              }                                           p=NULL;                                 }while(0)

int main()
{
    int *p=NULL;
    p=(int*)malloc(sizeof(int));
    TEST(p);
    printf("---------done!---------\n");
    return 0;
}

  \的作用是这一行的语句没有完,下一行内容是跟上一行联在一起的。

 

 

再来看一个出错的例子:

宏定义:  #define foo(x) bar(x); baz(x)

然后调用:       foo(x);  这样根据宏替换的原则就是:  bar(x);baz(x);          这是正确的!

但是如果这样:     if()

          foo(x)

就会被替换成:    if()

          bar(x);

        baz(x);              这显然是和我们希望执行的是不一样的!

 

 

 

为什么不用大括号直接把宏包围起来呢?为什么非得使用do/while(0)逻辑呢?

按照上面的例子:

if ()

{

    bar(wolf);
    baz(wolf);
};     //最后会添加;,在语法上是错误的!

以上是关于C语言do while问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的do while语句怎样理解

C语言中while语句和do while语句具体是如何循环的?

c语言问题咨询 do while 大括号的使用问题

c语言中的do-while循环怎么用啊?给个例子呗。

C语言while执行不了,代码见图?

C 语言宏定义中使用do...while