高分求解答,请问这是什么语法

[复制链接]
1600|16
 楼主| code 发表于 2016-5-10 09:55 | 显示全部楼层 |阅读模式
AC, ck, ni, TE, ui
    if(e>=2){
        s->divx_version= ver;
        s->divx_build= build;

        s->divx_packed= e==3 && last=='p';   <<<< ---- 请问这是什么语法 ????

        if(s->divx_packed && !s->showed_packed_warning) {
            av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n");
            s->showed_packed_warning=1;
        }
    }



1 . 如果是对变量进行赋值,就不应该用测试等于==啊。

2 . 如果是判断条件是否成立,但是又不怎么像。

谢谢啊!!

 楼主| code 发表于 2016-5-10 10:03 | 显示全部楼层
好像是

(e==3 )和(last=='p' )逻辑与的运算结果 , 然后赋值给 s->divx_packed
JY-DX-JY 发表于 2016-5-10 15:20 | 显示全部楼层
小乌龟真可爱
NE5532 发表于 2016-5-10 15:24 | 显示全部楼层
我只能引用谭浩强前辈书里的一句话来回答你:不要写那种自己都不知道计算机会怎么运行的程序。
heishe1989 发表于 2016-5-10 16:11 | 显示全部楼层
写法感觉不太规范吧
原野之狼 发表于 2016-5-10 20:03 | 显示全部楼层
加几个括号就明白了
ywlzh 发表于 2016-5-10 20:30 | 显示全部楼层
你还需要熟记C语言的运算法则啊 哈哈哈
还有一句,别这样写程序。
cool_coder 发表于 2016-5-10 23:40 | 显示全部楼层
想要写出可读性差的源码也不难,排版乱点,再堆上一堆不同优先级的运算符和常数就差不多了,像这样:
g=j-1&&j-2?c+++x.y->m[i^1]:~0xbadcode%2;
robter 发表于 2016-5-11 08:20 | 显示全部楼层
c语言就是任性
hgjinwei 发表于 2016-5-11 08:35 | 显示全部楼层
难道这样写会要了coder的命?
if(3 == e && 'p' == last){
    s->divx_packed = TRUE;
}
else{
    s->divx_packed = FALSE;
}
或者:
s->divx_packed= (e ==3 && last=='p');
 楼主| code 发表于 2016-5-11 09:36 | 显示全部楼层
写这个程序,正是大名鼎鼎的开源音视频解码编码库FFMPEG2.5.3版本

在ffmpeg-2.5.3\libavcodec\mpeg4videodec.c

static int decode_user_data(Mpeg4DecContext *ctx, GetBitContext *gb)
{
    MpegEncContext *s = &ctx->m;
    char buf[256];
    int i;
    int e;
    int ver = 0, build = 0, ver2 = 0, ver3 = 0;
    char last;

    for (i = 0; i < 255 && get_bits_count(gb) < gb->size_in_bits; i++) {
        if (show_bits(gb, 23) == 0)
            break;
        buf[i] = get_bits(gb, 8);
    }
    buf[i] = 0;

    /* divx detection */
    e = sscanf(buf, "DivX%dBuild%d%c", &ver, &build, &last);
    if (e < 2)
        e = sscanf(buf, "DivX%db%d%c", &ver, &build, &last);
    if (e >= 2) {
        ctx->divx_version = ver;
        ctx->divx_build   = build;

        s->divx_packed  = e == 3 && last == 'p';    <<<< ------  就是这个地方


        if (s->divx_packed && !ctx->showed_packed_warning) {
            av_log(s->avctx, AV_LOG_INFO, "Video uses a non-standard and "
                   "wasteful way to store B-frames ('packed B-frames'). "
                   "Consider using a tool like VirtualDub or avidemux to fix it.\n");
            ctx->showed_packed_warning = 1;
        }
    }

    /* libavcodec detection */
    e = sscanf(buf, "FFmpe%*[^b]b%d", &build) + 3;
    if (e != 4)
        e = sscanf(buf, "FFmpeg v%d.%d.%d / libavcodec build: %d", &ver, &ver2, &ver3, &build);
    if (e != 4) {
        e = sscanf(buf, "Lavc%d.%d.%d", &ver, &ver2, &ver3) + 1;
        if (e > 1)
            build = (ver << 16) + (ver2 << 8) + ver3;
    }
    if (e != 4) {
        if (strcmp(buf, "ffmpeg") == 0)
            ctx->lavc_build = 4600;
    }
    if (e == 4)
        ctx->lavc_build = build;

    /* Xvid detection */
    e = sscanf(buf, "XviD%d", &build);
    if (e == 1)
        ctx->xvid_build = build;

    return 0;
}
cuya 发表于 2016-5-12 00:22 | 显示全部楼层
这绝不是炫耀语法纯粹装B, 而是很自然, 很常用的语法。见得多了, 用得多了自然就习惯了。
当然, 一般要加括号, 这样阅读时更直观, 不必多花0.1秒的时间去解析。
jj8431 发表于 2016-5-12 19:48 | 显示全部楼层
帮你加上括号就好理解了

((s->divx_packed= e)==3 )&& (last=='p');
john_lee 发表于 2016-5-12 21:26 | 显示全部楼层
正常,程序写多了自然会习惯的。
loveteda 发表于 2016-5-15 12:43 | 显示全部楼层
s->divx_packed= e==3 && last=='p'
这个要查一下优先级吧,,是先进行赋值运算还是先进行e是否等于3的判断运算。。。
这种语句最好加上括号,否则读着很蛋疼。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:"></a><img src="http://uc2.21ic.com/avatar.php?uid=319240&size=middle"></img><a href="

40

主题

150

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部