(本文采用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. jq on绑定事件off移除事件

    https://www.cnblogs.com/sandraryan/ 以前用的是bind(); 后来更新后用的on (on() 方法是 bind().live() 和 delegate() 方法的新 ...

  2. hdu 2126 Buy the souvenirs(记录总方案数的01背包)

    Buy the souvenirs Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. 2019-1-29-win10-uwp-使用-Microsoft.Graph-发送邮件

    title author date CreateTime categories win10 uwp 使用 Microsoft.Graph 发送邮件 lindexi 2019-01-29 16:36:3 ...

  4. HDU 1850 Nim-Sum思想总结、

    算法介绍: Nim游戏是指两个对手在m个堆中轮流随意从某一个堆中拿出n个元素,假定两个对手都是足够聪明,直至最后一次取的人将所有元素取出,此人取得胜利.与之相反的是Misere游戏,相同的游戏规则,但 ...

  5. Python--day45--pymysql操作数据库详细

    1.一个pymysql往数据库提交数据的简单例子: import pymysql # user = "eric" # pwd = '123123' #增加 conn = pymys ...

  6. 第三章 通过java SDK 实现个性化智能合约的部署与测试

    想了解相关区块链开发,技术提问,请加QQ群:538327407 前提 已经部署好底层,外网可以正常请求访问. 正常流程 1.基础合约处理 https://fisco-bcos-documentatio ...

  7. 【js】React-Native 初始化时报错

    一.按照官网的步骤一步一步的操作,到最后  react-native init AwesomeProject  时就是报错 报错信息如下图 然后我下载了这个模块  npm install prompt ...

  8. Less 语法快速入门

    Less 语法快速入门 Less 是一门 CSS 预处理语言其可以运行在 Node 或浏览器端. 它将传统的 css 样式结构单一的排版顺序进行了优化,让我们可以通过层级嵌套的方式将 css 类名与H ...

  9. TOJ5705动态序列操作(STL or treap)

    传送门:动态序列操作 在一个动态变化的序列中,完成以下基本操作: (1)插入一个整数 (2)删除一个整数 (3)查找序列中最大的数 (4)查找序列中最小的数 (5)求x的前驱(前驱定义为不大于x的序列 ...

  10. apache WEB服务器安装(包括虚拟主机)

    一.apache下载编译安装 yum install apr apr-devel apr-util apr-util-devel gcc-c++ wget tar -y cd /usr/src wge ...