免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: safedead
打印 上一主题 下一主题

[C] [C实现]条件表达式的执行顺序是固定的吗? [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
221 [报告]
发表于 2012-09-29 16:24 |只看该作者
本帖最后由 starwing83 于 2012-09-29 16:27 编辑

回复 216# wwwsq


    这样吧,我找段代码给你看:
  1. void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
  2.   int loop;
  3.   for (loop = 0; loop < MAXTAGLOOP; loop++) {
  4.     const TValue *tm;
  5.     if (ttistable(t)) {  /* `t' is a table? */
  6.       Table *h = hvalue(t);
  7.       TValue *oldval = cast(TValue *, luaH_get(h, key));
  8.       /* if previous value is not nil, there must be a previous entry
  9.          in the table; moreover, a metamethod has no relevance */
  10.       if (!ttisnil(oldval) ||
  11.          /* previous value is nil; must check the metamethod */
  12.          ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL &&
  13.          /* no metamethod; is there a previous entry in the table? */
  14.          (oldval != luaO_nilobject ||
  15.          /* no previous entry; must create one. (The next test is
  16.             always true; we only need the assignment.) */
  17.          (oldval = luaH_newkey(L, h, key), 1)))) {
  18.         /* no metamethod and (now) there is an entry with given key */
  19.         setobj2t(L, oldval, val);  /* assign new value to that entry */
  20.         invalidateTMcache(h);
  21.         luaC_barrierback(L, obj2gco(h), val);
  22.         return;
  23.       }
  24.       /* else will try the metamethod */
  25.     }
  26.     else  /* not a table; check metamethod */
  27.       if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))
  28.         luaG_typeerror(L, t, "index");
  29.     /* there is a metamethod */
  30.     if (ttisfunction(tm)) {
  31.       callTM(L, tm, t, key, val, 0);
  32.       return;
  33.     }
  34.     t = tm;  /* else repeat with 'tm' */
  35.   }
  36.   luaG_runerror(L, "loop in settable");
  37. }
复制代码
这段代码来自著名的Lua5.2.1,Lua编程语言是游戏界公认的游戏脚本编程语言,也是目前世界上最小最快的脚本语言之一,是《魔兽世界》的官方插件编程语言。Lua的C实现也公认是十分优美的项目,被公认为“艺术性的实现”。这个函数是Lua语言中唯一的一种数据结构“表”的设置函数,可以认为是Lua的核心函数之一。请看看他在if里面用了多少赋值、短路特性吧。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
222 [报告]
发表于 2012-09-29 16:25 |只看该作者
wwwsq 发表于 2012-09-29 16:21
一段代码会做什么你都不知道,还在那里说自己看懂了,你不觉得脸红吗?



我不脸红,我很自豪,我请你宣传我的事迹:

OwnWaterloo 发表于 2012-09-29 15:56
对代码"++i = i++":
1. OwnWaterloo确认这代码没有统一的执行方式
2. wwwsq知道在centos6.1和gcc 4.1下面的执行结果
3. 因此OwnWaterloo没有看懂这代码而wwwsq看懂了。OwnWaterloo水平次。

你大可到处这么宣传,哦,不,我请你一定要这么宣传,并且是原封不动,断章取义不算数。

论坛徽章:
0
223 [报告]
发表于 2012-09-29 16:27 |只看该作者
OwnWaterloo 发表于 2012-09-29 16:25
我不脸红,我很自豪,我请你宣传我的事迹:



这是中兴通讯的编码规范:

【规则5-1-4】循环语句与判断语句中,不允许对其它变量进行计算与赋值。
说明:循环语句只完成循环控制功能,if语句只完成逻辑判断功能,不能完成计算赋值功能。


论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
224 [报告]
发表于 2012-09-29 16:28 |只看该作者
wwwsq 发表于 2012-09-29 16:21
一段代码会做什么你都不知道,还在那里说自己看懂了,你不觉得脸红吗?


你的这个回复,怎么不把下面这个问题一起回答了?

sacry 发表于 2012-09-29 16:15
回复 211# wwwsq

1/0无视吧,其实本来想说数学意义上的1/0,
问谁都不能给出“正确”答案,但是不代表别人不知道“这东西目前没答案”这个答案,因为它是个“未定义行为”。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
225 [报告]
发表于 2012-09-29 16:29 |只看该作者
wwwsq 发表于 2012-09-29 16:27
这是中兴通讯的编码规范:

【规则5-1-4】循环语句与判断语句中,不允许对其它变量进行计算与赋值。
说明:循环语句只完成循环控制功能,if语句只完成逻辑判断功能,不能完成计算赋值功能。


中兴通讯关我鸟事,我又不是中兴通讯的。

论坛徽章:
0
226 [报告]
发表于 2012-09-29 16:31 |只看该作者
starwing83 发表于 2012-09-29 16:24
回复 216# wwwsq



这是腾讯的编码规范:

7.1规则:用括号明确表达式的操作顺序,避免使用默认优先级。
7.2建议:不要编写太复杂 、多用途的复合表达式。
7.4规则:禁止使用难以理解,容易产生歧义的语句。



也明确的说“避免使用默认优先级”


论坛徽章:
0
227 [报告]
发表于 2012-09-29 16:32 |只看该作者
本帖最后由 hbmhalley 于 2012-09-29 16:33 编辑

回复 212# OwnWaterloo


    我觉得它表达偏了(++i=i++ 什么的更是越抹越黑), 但由于有一天我要用spaly又懒得写,于是翻出尘封的代码 于是 .. 于是就想砍死以前的自己 -- 所以稍微理解他想说什么
    大概就是 用了?: 晦涩 的代码是不推荐写的, 但看不懂不说明什么
    即 (不懂((用 ?:)and(晦涩)))=X=>(看的人水平次)
    不是 (用 ?:)=>(晦涩)=>(写的人水平次)

    由于他不是(至少不像)个学者, 因此不关注 晦涩 与 错误 的区别
    但审判是考官的权力, 管理者没有(至少他不承认自己有= =), 所以才抓住一段不仅ub而且屎一样(- -)的代码一顿狂黑 ...

    所以问题一开始就不是这屎代码对不对
    两种人 两个世界 两个理解
 匿了吧 ..

论坛徽章:
0
228 [报告]
发表于 2012-09-29 16:33 |只看该作者
OwnWaterloo 发表于 2012-09-29 16:29
中兴通讯关我鸟事,我又不是中兴通讯的。



当然,你可能比中兴或者腾讯的家伙都更牛。

既然你比那些人都牛,那比我这个小小的论坛坛友更牛,自然不在话下了。


论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
229 [报告]
发表于 2012-09-29 16:36 |只看该作者
wwwsq 发表于 2012-09-29 16:33
当然,你可能比中兴或者腾讯的家伙都更牛。

既然你比那些人都牛,那比我这个小小的论坛坛友更牛,自然不在话下了。


我有权利决定我所在公司的编码规范,而他们只能服从自己公司的编码规范。
所以他们的编码规范怎样怎样,以及他们技术牛不牛都不关我的事。
不过比你牛我还是很有信心的。

论坛徽章:
0
230 [报告]
发表于 2012-09-29 16:37 |只看该作者
OwnWaterloo 发表于 2012-09-29 16:36
我有权利决定我所在公司的编码规范,而他们只能服从自己公司的编码规范。
所以他们的编码规范怎样怎样 ...



哦,在小公司称王称霸这种事情啊,我之前也做过。挺好玩的。


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP