(本文采用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++乱码从入门到放弃的更多相关文章

  1. 爬虫入门到放弃系列07:js混淆、eval加密、字体加密三大反爬技术

    前言 如果再说IP请求次数检测.验证码这种最常见的反爬虫技术,可能大家听得耳朵都出茧子了.当然,也有的同学写了了几天的爬虫,觉得爬虫太简单.没有啥挑战性.所以特地找了三个有一定难度的网站,希望可以有兴 ...

  2. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  3. [精品书单] C#/.NET 学习之路——从入门到放弃

    C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...

  4. OpenStack从入门到放弃

    OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...

  5. 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃

    一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...

  6. 《区块链:从入门到放弃》之obc安装步骤

    obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...

  7. win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃

    博主所在学校特别坑爹,校园网被电信一家垄断了,而且最恶心的还是电信要求一条网线只能供一台电脑上网,不许接路由器共享网络= =- (还有电信2M价格是380+每年,20m是500每年,而且网速都很慢= ...

  8. WPF从入门到放弃系列第二章 XAML

    本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...

  9. Android -- 带你从源码角度领悟Dagger2入门到放弃

    1,以前的博客也写了两篇关于Dagger2,但是感觉自己使用的时候还是云里雾里的,更不谈各位来看博客的同学了,所以今天打算和大家再一次的入坑试试,最后一次了,保证最后一次了. 2,接入项目 在项目的G ...

随机推荐

  1. springboot中使用spring-session实现共享会话到redis(二)

    上篇文章介绍了springboot中集成spring-session实现了将session分布式存到redis中.这篇在深入介绍一些spring-session的细节. 1.session超时: 在t ...

  2. P1057 迷宫路径

    题目描述 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...

  3. 2018-12-25-WPF-如何在-WriteableBitmap-写文字

    title author date CreateTime categories WPF 如何在 WriteableBitmap 写文字 lindexi 2018-12-25 09:13:57 +080 ...

  4. Eclipse修改编码字体

    步骤:Window-->Preference-->General-->Appearance-->Colors and Fonts-->java-->java Edi ...

  5. vue中 js获取图片尺寸 设置不同样式

    1.JS: 请求到后端数据后 判断图片尺寸 2.HTML代码 根据设置的类型,给图片添加不同的样式 3.CSS代码 添加不同尺寸的样式

  6. Teleport ultra/IDM(Internet Download Manager)

    神器扒网站——teleport ultra IDM(Internet Download Manager) 在平时的开发或者学习的过程中,我们难免会看到一些让人心动的网站,于是自己想把它搞下来,自己手工 ...

  7. PC端网页特效

    元素偏移量offset系列 offset翻译过来就是偏移量,我们使用offset系列相关属性可以动态的得到该元素的位置(偏移),大小等 获得元素距离带有定位父元素的位置 获得元素自身的大小(宽度高度) ...

  8. VScode快捷键(最全)

    按 Press 功能 Function Ctrl + Shift + P,F1 显示命令面板 Show Command Palette Ctrl + P 快速打开 Quick Open Ctrl + ...

  9. JUnit 单元测试断言推荐 AssertJ

    文章转自:http://sgq0085.iteye.com/blog/2030609 前言 由于JUnit的Assert是公认的烂API,所以不推荐使用,目前推荐使用的是AssertJ. Assert ...

  10. Linux 内核sysfs 文件系统符号连接

    sysfs 文件系统有通常的树结构, 反映它代表的 kobjects 的层次组织. 但是内核中对象 间的关系常常比那个更加复杂. 例如, 一个 sysfs 子树 (/sys/devices )代表所有 ...