打印

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

[复制链接]
1280|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 | 只看该作者
我只能引用谭浩强前辈书里的一句话来回答你:不要写那种自己都不知道计算机会怎么运行的程序。

使用特权

评论回复
5
heishe1989| | 2016-5-10 16:11 | 只看该作者
写法感觉不太规范吧

使用特权

评论回复
6
原野之狼| | 2016-5-10 20:03 | 只看该作者
加几个括号就明白了

使用特权

评论回复
7
ywlzh| | 2016-5-10 20:30 | 只看该作者
你还需要熟记C语言的运算法则啊 哈哈哈
还有一句,别这样写程序。

使用特权

评论回复
8
cool_coder| | 2016-5-10 23:40 | 只看该作者
想要写出可读性差的源码也不难,排版乱点,再堆上一堆不同优先级的运算符和常数就差不多了,像这样:
g=j-1&&j-2?c+++x.y->m[i^1]:~0xbadcode%2;

使用特权

评论回复
9
robter| | 2016-5-11 08:20 | 只看该作者
c语言就是任性

使用特权

评论回复
10
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');

使用特权

评论回复
11
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;
}

使用特权

评论回复
12
cuya| | 2016-5-12 00:22 | 只看该作者
这绝不是炫耀语法纯粹装B, 而是很自然, 很常用的语法。见得多了, 用得多了自然就习惯了。
当然, 一般要加括号, 这样阅读时更直观, 不必多花0.1秒的时间去解析。

使用特权

评论回复
13
jj8431| | 2016-5-12 19:48 | 只看该作者
帮你加上括号就好理解了

((s->divx_packed= e)==3 )&& (last=='p');

使用特权

评论回复
14
john_lee| | 2016-5-12 21:26 | 只看该作者
正常,程序写多了自然会习惯的。

使用特权

评论回复
15
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

粉丝