c – 三元运算符作为命令?
在
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). 任何人都可以解释它究竟是什么以及它是如何工作的? 解决方法
请注意,您链接的代码非常糟糕,并且由一个非常糟糕的程序员编写.特别是声明
是完整的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替换它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- STM32f103 —— 内部flash读写
- SQLite实现建表,增删改查,分页
- 关于sax解析XML文件的简单流程+工具类
- ruby-on-rails – Rails数据/数据变形问题
- Swift 3 实现拍照功能
- c# – Xamarin.Forms Google API使用身份提供程序对用户进行
- 所有祖先/父项和子项的单一层次查询(DB2 / SQLServer)
- ruby-on-rails – Postgresql的问题`initialize` … Socket
- swift – 在Xcode 6.0.1中的Interface Builder中,“限制边缘
- Swift-新手最难懂的"?" "!" "