4.7 条件运算符

本文通过几个具体的C++程序实例,介绍了如何使用条件运算符、逻辑运算符进行判断及表达式的处理,并对常见错误进行了说明。

练习4.21

	int main() 
	{
		vector<int> a = { 0,1,2,3,4,5,6,7,8,9 };
		for (auto i : a)
		{
			cout << (i % 2 == 0 ? i : 2 * i) << " ";
		}

     }

在这里插入图片描述
练习4.22

int main() 
	{
		int grade = 0;
		cin >> grade;
		string fg;

		fg = (grade > 90) ? "high pass" : (grade > 75) ? "pass":(grade < 60)?"fail":"low pass";
		cout << fg;

     }
int main() 
	{
		int grade = 0;
		cin >> grade;
		string fg;

		if (grade > 90)
			cout << "high pass";
		else {
			if (grade > 75)
				cout << "pass";
			else
			{
				if (grade < 60)
					cout << "fail";
				else
					cout << "low pass";
			}
		}
     }

我觉得条件运算符好理解一些,但是会要求表达式类型相同或可能转换为某个公共类型,所以更加束缚一些。

练习4.23
错误在于==两端的值,一个是字符串字面值,一个是字符字面值,无法比较,将右侧的字符更改成字符串即可。

int main() 
	{
		string s = "word";
		string p1 = s + s[s.size() - 1];
		cout << p1 << endl; //wordd

		string p2 =s + s[s.size() - 1] == "s" ? "" : "s";
		//先加法,wordd
		//再==, "wordd" = "s" ?
		//再条件?:
		//0?"":"s"
		cout << p2 << endl; //"s"
     }`

练习4.24
举例解释左结合律和右结合律:

关系运算符满足左结合律

if(i < j < k) //拿i<j的布尔值结果和k比较

if条件语句部分首先将i、j和第一个<运算符组合在一起,其返回的布尔值再作为第二个<运算符的左侧运算对象。也就是说,k比较的对象是第一次比较得到的那个或真或假的结果。

赋值运算满足右结合律

int ival, jval;
ival = jval = 0; //正确:都被赋值为0

靠右的赋值运算jval = 0作为靠左的赋值运算符的右侧运算对象。又因为赋值运算返回的是其左侧运算对象,所以靠右的赋值运算的结果(即jval)被赋给了ival。

下面此题左结合律的算法:

fg = ((grade > 90) ? "high pass"(grade<60))?"fail":"pass";

"high pass"和grade<60不是同一类型,编译错误,但能运行。
在这里插入图片描述

运行时是上图中的代码

  • 如果grade大于90
//实际上给fg赋值分为2步
fg = grade > 90 ? " high pass" : (grade <60); //grade > 90 为真, 返回“high pass”
fg = "high pass" ? "fail" : "pass"; //非空字符串,条件为真,返回“fail”
  • 如果grade小于等于90,大于等于60
fg = grade > 90 ? " high pass" : (grade <60); //grade > 90 为假,返回 (grade < 60)
fg = (grade < 60) ? "fail" : "pass"; //条件为假,返回“pass”
  • 如果grad小于60,输出fail
fg = grade > 90 ? " high pass" : (grade <60); //grade > 90 为假,返回 (grade < 60)
fg = (grade < 60) ? "fail" : "pass";  //条件为真,返回“fail”
<think>嗯,用户这次明确询问Sniffer Pro 4.7的过滤功能使用方法。虽然这个版本较老(2003年发布),但考虑到企业环境中可能仍有使用,需要提供完整指导。 用户似乎是网络管理员或安全分析人员,可能遇到了特定流量捕获需求。ta特意强调版本号,说明可能在使用旧系统,需要确保所有操作步骤完全兼容4.7版本。要注意两点:一是4.7版与新版界面差异较大,二是某些过滤语法可能有版本限制。 准备从三层结构展开:首先是基础捕获过滤(类似tcpdump语法),其次是显示过滤(针对已捕获数据),最后是进阶功能如过滤器库。关键点包括:BPF语法示例、ARP欺骗检测的专属过滤串、保存过滤器的位置(默认在C:\Program Files\NAI\SnifferNT\Program\Filters)。 需要警惕的是,用户可能真正想解决的是某种网络攻击排查(如询问"port 21"过滤器),但未明确说明。在回答最后特意加入了取证类问题作为引导,这样既解答表面问题,又预留深入探讨空间。 </think>以下是Sniffer Pro 4.7版本过滤功能的详细使用方法(基于官方文档和操作实践): ### 一、基础过滤操作 1. **捕获前过滤(Capture Filter)** - 启动捕获前点击工具栏 **"Select Filter"** - 在`New`选项卡创建新过滤器,支持协议分层选择: ``` Layer 2: MAC地址过滤(如 00:1A:C2:XX:XX > 00:0D:BD:XX:XX) Layer 3: IP地址/网段(如 ip host 192.168.1.100) Layer 4: 端口过滤(如 tcp port 80) ``` - 逻辑运算符:`AND`/`OR`/`NOT`(如过滤FTP登录:`port 21 and not tcp[13] & 4 != 0`)[^1] 2. **实显示过滤(Display Filter)** 捕获后点击 **"Define Display Filter"**(漏斗图标) - 表达式生成器支持协议字段过滤(如`HTTP.Request.Method == "GET"`) - 十六进制过滤:`hex(offset:length) == 0xFFFF`(例:过滤ARP欺骗:`hex(0x0C:2) == 0x0806`)[^2] ### 二、高级过滤技巧 1. **布尔表达式组合** ```sql (ip.src == 192.168.1.0/24) && (tcp.flags.syn == 1) && !(udp.port == 53) ``` 2. **模式匹配** - 数据包内容匹配:`tcp contains "admin"` - 正则表达式:`http.host matches ".*\.example\.com"` 3. **过滤器库管理** - 预置模板:`Profiles > Default`含常见协议模板 - 导出共享:`File > Save Filter Profile`保存为`.fpf`文件 ### 三、典型场景配置 | **场景** | **过滤配置** | 用途 | |-------------------|-------------------------------------------|--------------------------| | 检测网络扫描 | `tcp.flags.syn == 1 && tcp.flags.ack == 0` | SYN洪水攻击监测 | | HTTP文件下载分析 | `http.content_type contains "application"` | 抓取文件传输流 | | VoIP质量诊断 | `udp.portrange(16384-32768)` | RTP流媒体捕获 | ### 四、注意事项 1. 版本限制:4.7版不支持IPv6过滤(需升级到4.8+) 2. 性能优化:复杂过滤建议启用 **"Capture > Buffer Settings"** 增大缓存 3. 语法验证:表达式错误状态栏显示 **"Filter NOT compiled"** > 操作路径参考:`Capture > Trigger Setup` 可设置捕获触发条件(如达到特定包数量自动停止)[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值