程序的编译与链接(预处理详解)+百度面试笔试题+《高质量C/C++编程指南》笔试题
本篇重点介绍程序的编译与链接过程中的预处理阶段,将详细的介绍在预处理阶段会发生什么,以及讲解有关百度该内容的面试笔试题和源于《高质量C/C++编程指南》的笔试题。
- 一.【预处理详解】
- ①预定义符号
- ②#define
- 2.1 #define 定义标识符
- 注意:
- 2.2 #define 定义宏
- 注意:
- 警告:
- 提示
- 2.3 #define 替换规则
- 注意:
- ③ #和##
- 3.1 #的作用
- 3.2 ## 的作用
- ④带副作用的宏参数
- ⑤宏和函数对比
- 5.1命名约定
- ⑥#undef
- ⑦命令行定义
- ⑧条件编译
- ⑨文件包含
- 9.1 头文件被包含的方式:< >与" "
- 注意:
- 9.2 嵌套文件包含
- 二. 【百度笔试题】
- Ⅰ.offsetof宏的实现
- Ⅱ 交换奇偶位
- 三.【《高质量C/C++编程指南》笔试题】
- Ⅰ.头文件中的 ifndef/define/endif是干什么用的?
- Ⅱ. #include <filename.h> 和 #include "filename.h"有什么区别?
一.【预处理详解】
①预定义符号
FILE //进行编译的源文件
LINE //文件当前的行号
DATE //文件被编译的日期
TIME //文件被编译的时间
STDC //如果编译器遵循ANSI C,其值为1,否则未定义
这些预定义符号都是语言内置的。
举个例子:
printf("file:%s line:%d\n", __FILE__, __LINE__);
②#define
2.1 #define 定义标识符
语法:
#define name stuff
举个例子:
#define MAX 1000
#define reg register //为 register这个关键字,创建一个简短的名字
#define do_forever for(;;) //用更形象的符号来替换一种实现
#define CASE break;case //在写case语句的时候自动把 break写上。
// 如果定义的 stuff过长,可以分成几行写,除了最后一行外,每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \date:%s\ttime:%s\n" ,\
__FILE__,__LINE__ , \
__DATE__,__TIME__ )
注意:
在define定义标识符的时候,要不要在最后加上 ; ?
比如:
#define MAX 20;
#define MAX 20
建议不要加上 ; ,这样容易导致问题。
比如下面的场景:
if(condition)max = MAX;//MAX直接替换成20; 那就有两个;;
elsemax = 0;
这里会出现语法错误
2.2 #define 定义宏
#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义
宏(define macro)。
下面是宏的申明方式:
#define name( parament-list ) stuff
其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中。
注意:
参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
如:
#define SQUARE( x ) x * x正确写法:#define SQUARE(x) x * x
这个宏接收一个参数 x .
如果在上述声明之后,你把SQUARE( 5 );
置于程序中,预处理器就会用下面这个表达式替换上面的表达式:5 * 5
警告:
这个宏存在一个问题:
观察下面的代码段:
int b = 6;
printf("%d\n" ,SQUARE( b + 1) );
乍一看,你可能觉得这段代码将打印49这个值。
事实上,它将打印13.
为什么?
替换文本时,参数x被替换成b + 1,所以这条语句实际上变成了:
printf (“%d\n”,b+ 1 * b + 1 );
这样就比较清晰了,由替换产生的表达式并没有按照预想的次序进行求值。
在宏定义上加上两个括号,这个问题便轻松的解决了:
#define SQUARE(x) (x) * (x)
这样预处理之后就产生了预期的效果:
#define SQUARE(x) (b+1) * (b+1)
也就是
#define SQUARE(x) (6+1) * (6+1)
这里还有一个宏定义:
#define DOUBLE(x) (x) + (x)
定义中我们使用了括号,想避免之前的问题,但是这个宏可能会出现新的错误。
int b = 1;
printf("%d\n" ,10 * DOUBLE(b));
这将打印什么值呢?
warning:
看上去,好像打印20,但事实上打印的是11.
我们发现替换之后:
printf ("%d\n",10 * (1) + (1));
乘法运算先于宏定义的加法,所以出现了
11.
这个问题,的解决办法是在宏定义表达式两边加上一对括号就可以了:
#define DOUBLE(x) ( ( x ) + ( x ) )
提示
所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或邻近操作符之间不可预料的相互作用
2.3 #define 替换规则
在程序中扩展#define定义符号和宏时,需要涉及几个步骤。
- 在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先
被替换。 - 替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值替换。
- 最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的符号。如果是,就重复上
述处理过程。
注意:
- 宏参数和#define 定义中可以出现其他#define定义的变量。但是对于宏,不能出现递归。
- 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。
③ #和##
如何把参数插入到字符串中?
首先我们看看这样的代码:
char* p = "hello ""xiao tao\n";
printf("hello"," xiao tao\n");
printf("%s", p);
我们发现答案是:
我们发现字符串是有自动连接的特点的。
所以那我们是不是可以写这样的代码?:
#define PRINT(FORMAT, VALUE) printf("the value is "FORMAT"\n", VALUE);
int main()
{PRINT("%d", 10);return 0;}
这里只有当字符串作为宏参数的时候才可以把字符串放在字符串中。
另外一个技巧是
3.1 #的作用
使用 # ,把一个宏参数变成对应的字符串
比如:
#define PRINT(FORMAT, VALUE) printf("the value of " #VALUE " is "FORMAT"\n", VALUE);
int main()
{int i = 20;PRINT("%d", i + 5);//产生了什么效果?return 0;
代码中的 #VALUE 会预处理器处理为:
“VALUE” .
所以最终的输出的结果应该是:the value of i+3 is 13
3.2 ## 的作用
##可以把位于它两边的符号合成一个符号。
它允许宏定义从分离的文本片段创建标识符。
例如:
#define ADD_TO_SUM(num, value) sum##num += value;
int main()
{int sum5 = 0;//sum5初始化为0;ADD_TO_SUM(5, 10);//作用是:给sum5增加10.//sum##num += value;---> sum5+=10;return 0;
}
注意:
这样的连接必须产生一个合法的标识符。否则其结果就是未定义的。
④带副作用的宏参数
当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能
出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。
例如:
a+1;//不带副作用
a++;//带有副作用
MAX宏可以证明具有副作用的参数所引起的问题。
#define MAX(a, b) ( (a) > (b) ? (a) : (b) )
int main()
{int x = 4;int y = 3;int z = MAX(x++, y++);printf("x=%d y=%d z=%d\n", x, y, z);//输出的结果是什么?return 0;
}
这里我们得知道预处理器处理之后的结果是什么:
z = ( (x++) > (y++) ? (x++) : (y++));
所以输出的结果是:
x=6; y=4; z=5;
解析:
⑤宏和函数对比
宏通常被应用于执行简单的运算。比如在两个数中找出较大的一个。
#define MAX(a, b) ((a)>(b)?(a):(b))
那为什么不用函数来完成这个任务?
原因有二:
- 用于调用函数和从函数返回的代码可能比实际执行这个小型计算工作所需要的时间更多。所以宏比
函数在程序的规模和速度方面更胜一筹。 - 更为重要的是函数的参数必须声明为特定的类型。所以函数只能在类型合适的表达式上使用。反之
这个宏怎可以适用于整形、长整型、浮点型等可以用于>来比较的类型。宏是类型无关的。
当然和宏相比函数也有劣势的地方: - 每次使用宏的时候,一份宏定义的代码将插入到程序中。除非宏比较短,否则可能大幅度增加程序
的长度。 - 宏是没法调试的。
- 宏由于类型无关,也就不够严谨。
- 宏可能会带来运算符优先级的问题,导致程容易出现错
宏有时候可以做函数做不到的事情。比如:宏的参数可以出现类型,但是函数做不到。
5.1命名约定
一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。
那我们平时的一个习惯是:
把宏名全部大写
函数名不要全部大写
⑥#undef
这条指令用于移除一个宏定义。
#undef NAME
//如果现存的一个名字需要被重新定义,那么它的旧名字首先要被移除
⑦命令行定义
许多C 的编译器提供了一种能力,允许在命令行中定义符号。用于启动编译过程。
例如:当我们根据同一个源文件要编译出不同的一个程序的不同版本的时候,这个特性有点用处。(假
定某个程序中声明了一个某个长度的数组,如果机器内存有限,我们需要一个很小的数组,但是另外一
个机器内存大写,我们需要一个数组能够大写。)
#include <stdio.h>
int main()
{int array [ARRAY_SIZE];int i = 0;for(i = 0; i< ARRAY_SIZE; i ++){array[i] = i;}for(i = 0; i< ARRAY_SIZE; i ++){printf("%d " ,array[i]);}printf("\n" );return 0;
}
编译指令:
gcc -D ARRAY_SIZE=10 programe.c
⑧条件编译
在编译一个程序的时候我们如果要将一条语句(一组语句)编译或者放弃是很方便的。因为我们有条件编译指令。
1.
#if 常量表达式//...
#endif
//常量表达式由预处理器求值。
如:
#define __DEBUG__ 1
#if __DEBUG__//..
#endif
2.多个分支的条件编译
#if 常量表达式//...
#elif 常量表达式//...
#else//...
#endif
3.判断是否被定义
#if defined(symbol)
#ifdef symbol
#if !defined(symbol)
#ifndef symbol
4.嵌套指令
#if defined(OS_UNIX)#ifdef OPTION1unix_version_option1();#endif#ifdef OPTION2unix_version_option2();#endif
#elif defined(OS_MSDOS)#ifdef OPTION2msdos_version_option2();#endif
#endif
⑨文件包含
我们已经知道, #include 指令可以使另外一个文件被编译。就像它实际出现于 #include 指令的地方
一样。
这种替换的方式很简单:
预处理器先删除这条指令,并用包含文件的内容替换。
这样一个源文件被包含10次,那就实际被编译10次.
9.1 头文件被包含的方式:< >与" "
- 本地文件包含
#include "filename"
查找策略:
先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件。
如果找不到就提示编译错误。
- 库文件包含
#include <filename.h>
查找头文件直接去库函数下去查找,如果找不到就提示编译错误。
注意:
这样是不是可以说,对于库文件也可以使用 “” 的形式包含
答案是:可以,但没必要。
但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了。
9.2 嵌套文件包含
当写一个项目时,通常需要将各个功能分开,分配给不同的程序猿写,如果遇到下面的情况:
也就是test程序中最终会出现两份common.h的内容,这样就造成文件内容的重复。
如何解决这个问题?
答案:条件编译
每个头文件的开头写:
#ifndef __TEST_H__//如果第一次没有定义这个文件
#define __TEST_H__//则定义一下。如果第二次出现了,就不编译
//头文件的内容
#endif
或者:
#pragma once
就可以避免头文件的重复引入。
二. 【百度笔试题】
Ⅰ.offsetof宏的实现
介绍:
我们首先要知道offsetof如何使用
#include <stddef.h>
struct S
{char c;int a;double f;};
int main()
{printf("%d\n", offsetof(struct S,c));printf("%d\n", offsetof(struct S,a));printf("%d\n", offsetof(struct S,f));return 0;
}
思路:
#define OFFSETOF(type,member) (int)&(((type*)0)->member)
//首先将0强制转换为结构体指针类型,
//然后指向成员变量,
//再取出成员的地址这个地址就是偏移量
struct S
{char c;int a;double f;};
int main()
{printf("%d\n", OFFSETOF(struct S,c));printf("%d\n", OFFSETOF(struct S,a));printf("%d\n", OFFSETOF(struct S,f));return 0;
}
Ⅱ 交换奇偶位
思路:
1.整数有32个比特位,也就是有16个奇数位,16个偶数位,要将奇数位偶数位全部交换。
2.我们可以将奇数位全部保留偶数位先不要。然后将奇数位向左移动1位。这样就把奇数位移动到偶数位了。
3.接着我们再将偶数位保留,奇数位不要,将偶数位向右移动1位,这样就把偶数位移动到奇数位上了
4.最后两个相加就得到奇数位和偶数位交换的数了
如何保留奇数位呢?去掉偶数位呢?
奇数位上&1,偶数位上&0
11111111111111111111111111111111
01010101010101010101010101010101
16进制表示0x55555555
如何保留偶数位呢?去掉奇数位呢?
偶数位&1,奇数位&0.
11111111111111111111111111111111
10101010101010101010101010101010
16进制表示0xaaaaaaaa
#define SWAP(n) ((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1)
int main()
{int n = 10;printf("%d", SWAP(n));return 0;
}
结果:
三.【《高质量C/C++编程指南》笔试题】
Ⅰ.头文件中的 ifndef/define/endif是干什么用的?
防止嵌套文件包含
Ⅱ. #include <filename.h> 和 #include "filename.h"有什么区别?
#include <filename.h>会直接到库函数所在的目录去查找头文件
#include "filename.h"会先在所在的文件目录去查找,如果找不到再去库函数里找
相关文章:
程序的编译与链接(预处理详解)+百度面试笔试题+《高质量C/C++编程指南》笔试题
本篇重点介绍程序的编译与链接过程中的预处理阶段,将详细的介绍在预处理阶段会发生什么,以及讲解有关百度该内容的面试笔试题和源于《高质量C/C编程指南》的笔试题。一.【预处理详解】①预定义符号②#define2.1 #define 定义标识符注意:2.2 #…...
全解析 ESM 模块语法,出去还是进来都由你说了算
模块语法是ES6的一个重要特性,它的出现让JavaScript的模块化编程成为了可能。 在JavaScript中可以直接使用import和export关键字来导入和导出模块,但是这种语法并不是ES6的标准,而是ESM(ECMAScript Module)模块语法的…...
MATLAB 粒子群算法
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…...
java微信小程序音乐播放器分享系统
随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,音乐播放器小程序被用户普遍使用,为方便用户能够可以随时进行音乐播放器小程序的数据信息管理,特开发了基于音乐播放器小程序…...
VS各版本VC各版本对应关系
Visual Studio 经过多年的发展,有许多版本,经常我们在拿到一份代码时不知道对应的VS版本 这时候可以打开工程目录下的vcproj/vcxproj文件,如下所示 <?xml version"1.0" encoding"utf-8"?> <Project DefaultT…...
如何处理“WLAN没有有效的IP配置”这一问题?
🚀write in front🚀 📜所属专栏:暂无 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的…...
ElasticSearch-学习笔记05【SpringDataElasticSearch】
Java后端-学习路线-笔记汇总表【黑马程序员】ElasticSearch-学习笔记01【ElasticSearch基本介绍】【day01】ElasticSearch-学习笔记02【ElasticSearch索引库维护】ElasticSearch-学习笔记03【ElasticSearch集群】ElasticSearch-学习笔记04【Java客户端操作索引库】【day02】Ela…...
【GlobalMapper精品教程】045:空间操作(2)——相交(Intersect)
GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述相交工具的使用。 文章目录 一、实验数据二、符号化设置三、相交运算四、结果展示五、心灵感悟一、实验数据 加载配套实验数据(…...
Android 一体机研发之修改系统设置————自动锁屏
Android 一体机研发之修改系统设置————屏幕亮度 Android 一体机研发之修改系统设置————声音 Android 一体机研发之修改系统设置————自动锁屏 修改系统设置系列篇章马上开张了! 本章将为大家细节讲解自动锁屏。 自动锁屏功能,这个可以根据…...
七天实现一个go rpc框架
目录rpc协议目的关于RPC和框架服务端与消息编码确保接口的实现消息的序列化与反序列化通信过程服务端的实现main 函数支持并发与异步的客户端Call 的设计实现客户端服务注册(service register)通过反射实现 service集成到服务端超时处理创建连接超时Client.Call 超时服务端处理…...
EMQX Cloud Serverless 正式上线:三秒部署、按量计费的 MQTT Serverless 云服务
近日,全球领先的开源物联网数据基础设施软件供应商 EMQ 正式发布了 MQTT Serverless 云服务 —— EMQX Cloud Serverless 的 Beta 版本,开创性地采用弹性多租户技术,用户无需关心服务器基础设施和服务规格伸缩所需资源,仅用三秒即…...
快速排序 容易理解的版本
package huaweiod.排序算法;import java.util.Arrays;public class 快速排序 {public static void main(String[] args) {int[] arr {9,8,3,5,6,7,8,9};mysort(arr, 0, arr.length - 1); // myprint(arr," ");}private static void myprint(int[] arr, Strin…...
Linux体系结构
Linux体系结构一、引入概念二、内核三、管理1、内存管理2、进程管理3、进程调度控制进程对CPU的访问4、设备驱动程序和网络接口四、Linux Shell五、磁盘分区硬盘内的分区Linux下磁盘分区和目录的关系一、引入 操作系统的本质是什么? 是一种管理(协调)资源机制&…...
【汽车电子】什么是ADAS?
文章目录ADAS——先进驾驶辅助系统ADAS——商用车安全性能提升的利器总结ADAS——先进驾驶辅助系统 ADAS,全称Advanced Driver Assistance Systems ,“先进驾驶辅助系统”,adas是汽车上面的一种系统,中文名叫做高级驾驶辅助系统&…...
java: 错误: 不支持发行版本 5(快速解决办法)
目录 前言 一、出现报错 二、报错的原因 三、解决办法 四、解决成功 前言 在maven web项目上面要部署运行tomcat时候,会出现这个问题 一、出现报错 java: 错误: 不支持发行版本 5 二、报错的原因 (1)官方解释:这个错误…...
QT中pro文件常用qmake语法
变量 配置QT模块 QT core gui sql network QT - sql注释 # 开启注释 # DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 # disables all the APIs deprecated before Qt 6.0.0添加源文件 SOURCES \main.cpp \widget.cppSOURCES *.cpp SOURCES 1.cpp 2.cpp 3.cpp添加…...
Android 一体机研发之修改系统设置————声音
Android 一体机研发之修改系统设置————屏幕亮度 Android 一体机研发之修改系统设置————声音 Android 一体机研发之修改系统设置————自动锁屏 修改系统设置系列篇章马上开张了! 本章将为大家细节讲解声音。 对于声音功能大家都不陌生,在多…...
挖掘长尾关键词的五大思路
本文重点介绍做SEO挖掘长尾词的五大思路:长尾词是搜索量不大,但是关键词的量非常庞大的词,那我们可以通过以下方法挖掘:1、目标型长尾搜索的关键词是直接包含了商业需求的,直接能跟我们的服务或产品对接的,…...
ccc-Brief Introduction of Deep Learning-李宏毅(6)
文章目录Three Steps for Deep LearningFully Connect Feedforward NetworkMatrix OperationOutput Layer as Multi-Class ClassifierExample ApplicationNeural NetworkGoodness of functionPick the best functionThree Steps for Deep Learning 与机器学习三步骤基本相同。 …...
【TVM 学习资料】用 Schedule 模板和 AutoTVM 优化算子
完整 TVM 中文文档,访问→TVM 中文站 作者:Lianmin Zheng,Chris Hoge 本教程将展示如何用 TVM 张量表达式(TE)语言编写 schedule 模板,并通过 AutoTVM 对模板进行搜索,从而找到最佳 schedule。…...
蓝牙Mesh学习笔记(一)
Mesh系统结构1 Mesh网络分层1.1 模型层(Model layer)1.2 基础模型层(Foundation Model layer)1.3 接入层(Access layer)1.4 上层传输层(Upper transport layer)1.5 下层传输层(Lower transport layer)1.6 网络层(Network layer)1.7 承载层(Bearer layer)1.8 BLE内核规范(BLE Co…...
【1234. 替换子串得到平衡字符串】
来源:力扣(LeetCode) 描述: 有一个只含有 Q, W, E, R 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符…...
独自开:提供创业机会、享受平台分红、推出新颖赚钱副业
💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 前言 独自开:一款聚焦软件定制开发,独立、自主、开放平台 独创分层标准化平台架构,满足系统不断生长的个性化需求多端一键部署前端业务交互与展…...
C++【二叉树进阶(二叉搜索树)】
文章目录前言1、二叉搜索树1-1、 二叉搜索树概念2、二叉搜索树操作2-1、树和节点的基本框架2-2、二叉搜索树的查找2-3、中序遍历2-4、二叉搜索树的插入2-5、二叉搜索树的删除3、二叉搜索树的模拟实现3-1、循环版本3-2、递归版本4、二叉搜索树的应用4-1、K模型4-2、KV模型4-3、K…...
【C++初阶】vector的使用
大家好我是沐曦希💕 文章目录一.vector介绍二、构造函数三、遍历1.[]2.迭代器3.范围for四、容量操作1.扩容机制五、增删查改六、迭代器失效问题一.vector介绍 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。…...
OPenPCDet windows流程及其问题
首先的首先极其不推荐将OPenPCDet运行在Windows上,过程非常复杂,适配也不是很好,不推荐在windows下载并训练,本人做这个主要是方便再笔记本电脑上对实验结果进行整理,处理一些简单的推理评估等任务。如有必要请继续阅读: 以下是正文: 常规的安装流程不再赘述,请参考官方…...
【自学Python】Python字符大小写判断
大纲 Python字符串是否是小写 Python字符串是否是小写教程 在开发过程中,有时候我们需要判断一个 字符串 是否是小写形式(即,所有的字符都是小写字母,不是英文字符的忽略不做判断),在 Python 中ÿ…...
设计模式之美总结(开源实战篇)
title: 设计模式之美总结(开源实战篇) date: 2023-01-10 17:13:05 tags: 设计模式 categories:设计模式 cover: https://cover.png feature: false 文章目录1. Java JDK 应用到的设计模式1.1 工厂模式在 Calendar 类中的应用1.2 建造者模式在 Calendar …...
两个月,测试转岗产品经理,我是怎么规划的?
本期同学依旧来自深圳 测试到产品转变,用了两个月 本周,为大家介绍M同学的佛系转岗经历 学员档 学员档案 原岗位:测试 转岗级别:中级产品经理 转岗特点: 1.未接触产品工作 2.对岗位地点要求严格 先看结果 …...
三数之和-力扣15-java排序+双指针
一、题目描述给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。…...
济宁教育平台网站建设/公司建网站需要多少钱
1.字符串用引号括起来的就是字符串,包括单双引号name "what is your name?"print(name.title()) //title函数输出字符串首字母大写print(name.upper()) //全部大写print(name.lower()) //全部小写 2.合并(链接)字符串 first_name…...
h5响应式网站/长沙营销型网站建设
在5G的大势所趋之下,手机厂商也逐渐展露了各自在5G上的布局,其中华为与OPPO两大头部厂商也都推出了自家的5G手机:华为Mate30 Pro 5G和OPPO Reno3 Pro。这两部双模5G手机可以说都是“黑科技”于一身,旨在为消费者带去更好的体验&am…...
wordpress 关键词堆砌/seo外包服务项目
1、概念 在代码块内,使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。 2、注意 “暂时性死区”也意味着typeof不再是一个百分之百安全的…...
广南网站建设/网络优化基础知识
本文由曹素杰(阿里云 MVP 石化盈科信息技术有限责任公司 高级工程师)提供,若使用请标明出处。 内存溢出的表现:a) CPU会飙升到100%,如果是多核则乘以核数b) 日志中会出现OutOfMemoryError 分析原因步骤:a) …...
研发网站要多长时间/搜索引擎优化的分类
此文是依据赵磊在【QCON高可用架构群】中的分享内容整理而成。转载请事先联系赵磊及相关编辑。 赵磊,Uber高级project师,08年上海交通大学毕业。曾就职于微软。后添加Facebook主要负责Messenger的后端消息服务。这个系统在当时支持Facebook全球5亿人同一…...
如何在自己的网站上做直播/广州seo公司
前言 在Android开发中ListView是最为经常使用的控件之中的一个,基本每一个应用都会涉及到它,要使用ListView列表展示,就不可避免地涉及到另外一个东西——Adapter,我们都知道,Adapter是连接数据和列表界面的一个桥梁,一…...