C++乱码从入门到放弃
(本文采用C++11标准)(本文使用到的库文件:iostream)
话说前几天,我在一篇文章中看见一个加了两对大括号的main函数(大概长下面这样)
//一些必要的预处理代码...吧啦吧啦吧啦... int main()
{
{
//代码主体...吧啦吧啦吧啦...
}
}
当时我一脸懵哔,这是神马语法,能通过编译?于是乎我把这段代码COPY进我的Dev编译器,Amazing!居然 编译顺利过,运行也没出错!我突发奇想,如果能在代码中放一段乱码 还不出错 岂不是一件很装逼的事,于是便有了下面这段代码
#include<iostream> using namespace std; int main()
{
//我是一段用脸滚的乱码
'*';{=='\\'+'`'?('$'):;/***/~~~~!!!((+-+-/'\''|/0x9));};;;qdsojntbz:///0]=d\f@w|e%sv)vs%$^&d*(# //我是一段用手敲的代码
cout << "新年快乐呀!" << endl; return ;
}
把上面的代码COPY进你的编译器里运行,你会发现它不仅顺利通过了编译,还成功输出了"新年快乐呀!",这说明上面那段乱码是符合C++语法的,那到底怎样才能写出符合语法的乱码呢,经过我十多分钟的测试,这里来做一个总结(如果发现错误或有补充请通过下方评论区或通过公告栏中的邮箱告诉我,阿里嘎多!)
首先是最简单的注释(没学过注释的读者也不要急,后面我会专门写一篇文章讲解注释的),/***/和///都是常见的注释美化小技巧,其中/***/中的第二个*和///中的最后一个/都是注释内容,被编译器自动省略,所以不会引起任何错误,我可以像下面这样写注释
///////////////////////////////
/// /* ///
/// *编辑 at 2020年1月14日 ///
/// *编辑 by Space Time ///
/// /* ///
///////////////////////////////
接下来便是块和语句的开始和结束符了,开篇那段故事讲得便是它,{是块的开始符,}是块的结束符,块中可以写入代码,也可以不写任何东西(空块),例如int main(){return 0;}中的{}就是一个写入了return 0;的块,而int main(){}中的{}就是一个空块,块可以在代码中套无数层,所以下面这段代码是符合语法的
int main()
{{{{}}}}
但值得注意的是,{}不可以在全局作用域中出现,如下面这段代码是错误的
{
int main()
{}
} //报错
语句的结束符;也可以单独出现(空语句),所以下面这段代码也是符合语法的
int main()
{
;
;;;;
;;;;;;;
;;;;;;;;;;
}
再接下来是字面量,字面量可以作为一个语句单独出现,另外用于提高优先级的()也是可以套无数层的,所以下面这段代码还是符合语法的
int main()
{
"C++是世界上最好的语言!";
3.14159;
(((3.14159)));
1 + 1;
true + false;
"你大爷" == "你大爷";
}
切记不要出现++1这样的错误(因为1是右值),看懂了上面这段代码,我们再看看下面这段奇葩的代码
int main()
{
+-;
}
这既不+又不-的玩意到底是个什么鬼啊!But actually,它还是符合语法的,这里的+和-可以理解为正和负,所以+-1其实就是-1,但是由于两个+连在一起就变成了++1(会报错),两个-连在一起就变成了--1(也会报错),所以在写这种字面量时必须一+一-地交替写,还弄不清楚可以参考下面这段代码
int main()
{
+; //通过
-; //通过
+-; //通过
++; //报错
--; //报错
--+ //报错
+-+-; //通过
-+-+-+; //通过
}
最后一个也是最奇葩的,先来看下面这段代码
int main()
{
CppNB:
123;
}
注意CppNB后面的结束符是:而不是;,没想到吧,这段代码又双叒叕是符合语法的(不用怀疑,我瞎敲得代码永远是符合语法的),这是因为goto语句的标记是以:结尾的,所以只要你在:前敲的乱码符合goto标记的命名规范,它就不会报错(其实goto标记的命名规范和变量的命名规范是一样的),但要注意的是,标记后边必须有代码,像下面这样就是错误的
int main()
{
CppNB: //报错
}
看到这里你大概已经能够看懂开头那段我用脸滚的代码了,如果你还是看不懂,那可能是因为你不知道下面这些:
1.C++中以0开头的字面量是八进制数
2.C++中以0x开头的字面量是十六进制数
2./是÷的意思
4.|是逻辑运算符 或
5.!是逻辑运算符 非
6.~是位运算符 按位取反
6.\\是转义字符 \
7.\'是转义字符 '
8.'可以隐式转换为它对应的ASCLL码(我记得好像是39)
9.三目运算符语法是 判断我是true还是false?是ture取我:是false取我; (具体请自行谷歌)
0.我不太会数数
9.点完赞你就看得懂了 •ᴗ•
C++乱码从入门到放弃的更多相关文章
- 爬虫入门到放弃系列07:js混淆、eval加密、字体加密三大反爬技术
前言 如果再说IP请求次数检测.验证码这种最常见的反爬虫技术,可能大家听得耳朵都出茧子了.当然,也有的同学写了了几天的爬虫,觉得爬虫太简单.没有啥挑战性.所以特地找了三个有一定难度的网站,希望可以有兴 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- [精品书单] C#/.NET 学习之路——从入门到放弃
C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...
- OpenStack从入门到放弃
OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...
- 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃
一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...
- 《区块链:从入门到放弃》之obc安装步骤
obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...
- win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃
博主所在学校特别坑爹,校园网被电信一家垄断了,而且最恶心的还是电信要求一条网线只能供一台电脑上网,不许接路由器共享网络= =- (还有电信2M价格是380+每年,20m是500每年,而且网速都很慢= ...
- WPF从入门到放弃系列第二章 XAML
本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...
- Android -- 带你从源码角度领悟Dagger2入门到放弃
1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...
随机推荐
- 2002年NOIP普及组复赛题解
题目涉及算法: 级数求和:入门题: 选数:搜索: 产生数:搜索.高精度: 过河卒:动态规划. 级数求和 题目链接:https://www.luogu.org/problemnew/show/P1035 ...
- poj2632 累死了
题意: 给定A*B的格子,放入N个机器人,每个机器人初始位置及朝向给定.给定M条指令.指令类型有三种: 1.L:左转90° 2.R:右转90° 3.F:前进一格 问执行指令过程中 ...
- Vue 小实例 跑马灯效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2018-2-13-win10-uwp-隐藏实时可视化
title author date CreateTime categories win10 uwp 隐藏实时可视化 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 ...
- 基于Springboot+Junit+Mockito做单元测试
前言 前面的两篇文章讨论过< 为什么要写单元测试,何时写,写多细 >和<单元测试规范>,这篇文章介绍如何使用Springboot+Junit+Mockito做单元测试,案例选取 ...
- vue的filters过滤器的使用
举个例子,过滤后台转过来的时间格式2019-08-29T02:15:08.000+0000转换为2019-08-29T02:15:08 html部分 <span v-if="item. ...
- Linux 内核子系统
一个子系统是作为一个整体对内核一个高级部分的代表. 子系统常常(但是不是一直)出现 在 sysfs 层次的顶级. 一些内核中的例子子系统包括 block_subsys(/sys/block, 给块 设 ...
- Mybatis 多对多(易百教程)
mybatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作.因此在进行实体类多对多映射表 ...
- hadoop中 namenode的持久化
一.为什么namenode持久化 namenode通过内存存储hdfs集群的元数据(目录结构 文件信息 块对应关系),如果内存出现问题,那么会数据丢失,需要通过持久化,把内存中的数据定期的存储在硬盘中 ...
- LeetCode 1 Two Sum——在数组上遍历出花样
本文始发于个人公众号:TechFlow 今天是周末,和大家一起来看一道算法题.这道题是大名鼎鼎的LeetCode的第一题,也是面试当中非常常见的一道面试题.题目不难,但是对于初学者来说应该还是很有 ...