不理解while后面的(!x)

5.[填空题]读下列程序,写出程序的输出结果。

include < stdio . h >

void main (0
{ int x =1;
do(printf ("% d ", x --);} while (! x );
}

!x就是当x=0的时候条件成立,继续循环, 可以理解为 while (x==0) ,第一次输出x--的值为1,然后x为0,满足条件继续循环,输出x--值为0,然后x--为-1不满足跳出循环 输出结果为 1 0

!是取反的意思,当x不为0时,x为真,!x为假;反之,x为0时,x为假,!x为真。
while里面的!x意思就是x为0是继续循环,当x不为0时就退出循环。

思路:首先我们看程序,知道这是一个do-while的循环结构,所以该程序先执行一次循环语句,再进行条件判断。while后面括号里的可以是任意的表达式,最后根据逻辑值决定是不是要继续进行循环。而!x是单目运算符逻辑非,即x取0时,!x非0,x为非0时,!x为0。
现在来看程序。首先x赋初值为1,先输出x的初值1,再进行自减。所以x变为0,然后在while里面先取非,!x为非0,条件满足,继续执行循环。通过一次这样的循环我们得知该语句在执行操作后,并没有向假变化的趋势,所以该语句为死循环。