yc哈哈哈 发表于 2018-3-7 13:10:52

!什么意思啊

这个while后面的!什么意思啊

BngThea 发表于 2018-3-7 13:14:59

表示取反
true变成false
false变成true

yc哈哈哈 发表于 2018-3-7 13:15:47

BngThea 发表于 2018-3-7 13:14
表示取反
true变成false
false变成true

可以在详细些吗?谢谢

BngThea 发表于 2018-3-7 13:16:43

yc哈哈哈 发表于 2018-3-7 13:15
可以在详细些吗?谢谢

还要怎么详细?

orino 发表于 2018-3-7 13:20:29

!c2--,先判断c是否为0,为0则循环继续,接着c2=c2-1,

煮酒小贱 发表于 2018-3-7 14:17:11

可以参照!=,不等于的意思,!理解为“不”“否”

549444387@qq.co 发表于 2018-3-7 17:20:57

c2==0 加上感叹号后!c==1;
如果c2不是等于0,是其他的数时 加上感叹号后!c==0

就是取反符号

人造人 发表于 2018-3-7 20:05:41

自己看吧

        int c1 = 2, c2 = 0;
000C17CE C7 45 F8 02 00 00 00 mov         dword ptr ,2
000C17D5 C7 45 EC 00 00 00 00 mov         dword ptr ,0

        while(!c2--)
000C17DC 8B 45 EC             mov         eax,dword ptr
000C17DF 89 85 24 FF FF FF    mov         dword ptr ,eax
000C17E5 8B 4D EC             mov         ecx,dword ptr
000C17E8 83 E9 01             sub         ecx,1
000C17EB 89 4D EC             mov         dword ptr ,ecx
000C17EE 83 BD 24 FF FF FF 00 cmp         dword ptr ,0
000C17F5 75 2C                jne         main+73h (0C1823h)
                printf("%d%d\n", c1--, c2);
000C17F7 8B 45 F8             mov         eax,dword ptr
000C17FA 89 85 24 FF FF FF    mov         dword ptr ,eax
000C1800 8B 4D F8             mov         ecx,dword ptr
000C1803 83 E9 01             sub         ecx,1
000C1806 89 4D F8             mov         dword ptr ,ecx
000C1809 8B 55 EC             mov         edx,dword ptr
000C180C 52                   push      edx
000C180D 8B 85 24 FF FF FF    mov         eax,dword ptr
000C1813 50                   push      eax
000C1814 68 30 7B 0C 00       push      offset string "%d%d\n" (0C7B30h)
000C1819 E8 16 FB FF FF       call      _printf (0C1334h)
000C181E 83 C4 0C             add         esp,0Ch
000C1821 EB B9                jmp         main+2Ch (0C17DCh)

        return 0;
000C1823 33 C0                xor         eax,eax

必填的用户名 发表于 2018-3-7 20:49:00

“!”是运算符逻辑非,它的优先级比自减符“--”高,程序先执行“!c2”,判断结果为真,执行循环体输出“1,-1”,输出后再次判断循环条件,而之前的“!c2”为真,即值为1,所以自减过后变为0,判断结果为假,跳出循环体,程序结束

人造人 发表于 2018-3-7 21:39:17

必填的用户名 发表于 2018-3-7 20:49
“!”是运算符逻辑非,它的优先级比自减符“--”高,程序先执行“!c2”,判断结果为真,执行循环体输出“ ...

程序先执行“!c2”

也就是这样?
#include <stdio.h>

int main(void)
{
        int c1 = 2, c2 = 0;

        while( (!c2)-- )
                printf("%d%d\n", c1--, c2);

        return 0;
}


可是
1>------ 已启动全部重新生成: 项目: tmp, 配置: Debug Win32 ------
1>main.c
1>c:\visualstudioprojects\tmp\tmp\main.c(7): error C2105: “--”需要左值
1>已完成生成项目“tmp.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

红tea少年 发表于 2018-3-7 23:44:58

取反符号 真的变假 假的变真

Dr丶温 发表于 2018-3-8 07:38:04

就是用上所有这个符号的非0数字都会变成0,不执行程序,如果这个符号右边的数值是0就变成1,满足条件执行循环体的程序

yc哈哈哈 发表于 2018-3-8 11:25:33

谢谢大家的解答
页: [1]
查看完整版本: !什么意思啊