加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 三元运算符作为命令?

发布时间:2020-12-16 09:59:13 所属栏目:百科 来源:网络整理
导读:在 source-code for nanodns 中,有一个非典型的三元运算符用于尝试减小代码的大小: /* If the incoming packet has an AR record (such as in an EDNS request),* mark the reply as "NOT IMPLEMENTED"; using a?b:c form to save one byte*/q[11]?q[3]|=4:
在 source-code for nanodns中,有一个非典型的三元运算符用于尝试减小代码的大小:

/* If the incoming packet has an AR record (such as in an EDNS request),* mark the reply as "NOT IMPLEMENTED"; using a?b:c form to save one byte*/
q[11]?q[3]|=4:1;

这条线的作用并不明显.乍一看,它看起来像是为两个数组元素之一赋值,但事实并非如此.相反,它似乎是或者是一个数组元素,或者什么都不做(运行“命令”1).

看起来它应该是这行代码的替代品(确实长一个字节):

if(q[11])q[3]|=4;

字面上的等价物是这样的:

if (q[11])
  q[3]|=4;
else
  1;

三元运算符通常用作表达式的一部分,因此将其用作独立命令似乎很奇怪.加上看似不合适的地方1,这条线几乎可以作为混淆代码.

我做了一个快速测试,能够编译并运行一个C()程序,数据常量为“command”,例如void main(){0; ‘一个’; “FOOBAR”;假;}.它seems to be a sort of nop command,但我找不到有关此类用法的任何信息-Google isn’t very amenable to this type of search query).

任何人都可以解释它究竟是什么以及它是如何工作的?

解决方法

请注意,您链接的代码非常糟糕,并且由一个非常糟糕的程序员编写.特别是声明

“It is common practice in tiny C programs to define reused expressions
to make the code smaller”

是完整的b *** s ***.这句话就是事情开始变得非常糟糕的地方.

源代码的大小与编译器可执行文件的大小无关,也与该可执行文件的内存消耗无关,也与程序性能无关.它唯一影响的是程序员计算机上源代码文件的大小,以字节为单位表示.

除非你在80年代中期使用非常有限的硬盘空间对8086计算机进行编程,否则你永远不需要“减小代码的大小”.相反,写可读代码.

话虽这么说,因为q是一个字符数组,你链接的代码相当于

if(q[11])
{
  (int)(q[3] |= 4);
}
else
{
  1;
}

其中1是没有副作用的声明,它将被优化掉.它只放在那里,因为?:运算符需要第三个运算符.

if语句和?:运算符之间的唯一区别是微妙的:?:隐式平衡第2和第3个操作数之间的类型.

为了提高可读性并生成自我记录代码,代码应该被重写为类似的东西

if (q[AR_INDEX] != 0)
{
  q[REPLY_INDEX] |= NOT_IMPLEMENTED;
}

作为旁注,这里有一个错误:q [2] | = 128;. q是char类型,它具有实现定义的签名,因此这一行可能是灾难性的.核心问题是你永远不应该使用char类型进行逐位运算或任何形式的算术运算,这是一个典型的初学者错误.必须用uint8_t或unsigned char替换它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读