当前位置: 首页 > 编程日记 > 正文

【基础复习】二:预处理、const与sizeof


赋值语句

1.i的值为?

#include <iostream>
using namespace std;
int i = 1;
int main() {int i = i;
}

解析:
此时main函数内的i是优先考虑局部变量,除非使用作用域符号,否则是和外面值为1的i是无关的。
其次,使用g++编译,g++ main.cpp -Wall就会出现提示说i是未定义值的警告,因此虽然此处的i会始终输出为0,但是实际上它是未定义值。
传送门讲的比较清楚,要把声明、定义、初始化、赋值区分开,其中初始化又分为default initialization、 list initialization、 value initialization。第一个说内置类型的变量是未初始化的,第三个说内置类型的变量是初始化为0的,其实测试的结果更倾向为value initialization。



2.以下代码输出的结果?

#include <iostream>
using namespace std;int main() {int x = 2, y, z;x *= (y = z = 5); cout << x << endl;z = 3;x == (y = z); cout << x << endl;x = (y==z); cout << x << endl;x = (y&z); cout << x << endl;x = (y&&z); cout << x << endl;y = 4;x = (y|z); cout << x << endl;x = (y||z); cout << x << endl;return 0;
}

解析:
10 //赋值号是右结合的,赋值语句的返回值是赋值符号的左边的值
10 //等于号是比较符号,是不会改变变量的值
1 //判断相等的符号返回true/false,也就是1或0
3 //按位取与运算
1 //逻辑取与关系,两个运算变量都是0,结果才为0,否则为1
7 //按位取或运算
1 //逻辑取或运算

i++

1.下面两段代码输出有何不同?

#include <iostream>
using namespace std;int main() {int a, x;for (a = 0, x= 0; a <= 1 && !x++; a++) {a++;}cout << a << x << endl;return 0;
}
#include <iostream>
using namespace std;int main() {int a, x;for (a = 0, x = 0; a <= 1 && !x++;) {a++;}cout << a << x << endl;return 0;
}

解析:
分别是21和12,后置的自增符号相当于把自增拆出来,并放在后面一句就不多说了。



2.下面代码的输出结果是什么?

#include <stdio.h>int main() {int b = 3;int arr[] = {6, 7, 8, 9, 10};int *ptr = arr;*(ptr++) += 123;printf("%d %d\n", *ptr, *(++ptr));
}

解析:
8 8
在打印前,数组的值为{129, 7, 8, 9, 10}, ptr指向第2个。
由于C中的printf函数计算参数是从右到左压栈(不同语言不同编译器的函数,参数入栈顺序是可以不同的,但是因为C支持可变参数函数,例如printf函数的参数就是不确定的,因此函数无法知道具体有多少参数,在创建被调用者的AC(activation record)时就采用了从右往左入栈参数的方式,这样第一个参数就在栈顶了,这个编译原理课的道理,这有网上参考资料,之后顺带提一下,C是不支持默认参数的,关于编译器的新学到的知识,有两点,一点是副作用,一点是顺序点,大意就是在这个顺序点时,编译器要处理完前面所有语句带来的副作用,在这个点之后才可以进行新的语句的副作用的执行,那么,在两个顺序点之间的动作执行顺序是没有规定的哦,由不同家的编译器自己玩,科科传送门
最后,我们这一题,先算*(++ptr),那就是第ptr指向了第三个并取值,之后再算左边也是变成取第三个值了哦,那就是8 8.
后来经过测试(g++),发现从右往左压栈时,每次都计算了参数的值再压栈的。比如i++在i压栈后i自增,而++i是在压栈前自增再入栈。

编程风格

这个你已经很棒了,平时不要偷懒继续努力就好了啊,科科

类型转换

1.程序结果为?

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;int main() {float a = 1.0f;cout << (int)a << endl;cout << &a << endl;cout << (int&)a << endl;cout << boolalpha << ((int)a == (int&)a) << endl;//此时会输出什么?float b = 0.0f;cout << (int)b << endl;cout << &b << endl;cout << (int&)b << endl;cout << boolalpha << ((int)b == (int&)b) << endl;//此时会输出什么?return 0;
}

解析:
a是一个float类型的数,float在内存中的存储方式请看传送门,(0为特例,浮点数值为0时,指数和底数都为0),那么a内存中的32个字节放的是0 01111111 00000000000000000000000;一个int类型也是32个字节,int在内存中的存储方式请看传送门.
(int)a表示将浮点数强制转换为整型,小数部分将被直接截断,结果为0;
&a输出的是变量a在内存中的位置
(int&)a,是用整型的解释方式来读取浮点数a的内存,结果就为 1065353216(127<<23)
此时(int)a和(int&)a是不同的值,比较是否相等时输出false。
而值为0的浮点数在内存中的表示,所有位上全为0.因此,此时用整型的解释方式读取内存得到的结果还是0.



2.下面的程序结果是什么?

#include <stdio.h>
int main() {unsigned int a = 0xFFFFFFF7;unsigned char i = (unsigned char)a;char* b = (char*)&a;printf("%08x, %08x", i, *b);
}

解析:
这里因为考虑是x86系列机器(《计算机组成原理》的相关知识啦),是小端存储(俗称“低低高高”,低字节放低地址,高字节放高地址),所以字符型i的内存是整型a的小端部分,也就是F7. 而b直接对a内存取地址并截取一个字节出来,此时得到的是小端部分F7。因为%08x是将参数以整型的16进制格式输出,不足部分左侧补符号位,i是无符号的,b是有符号的,所以输出为
0x000000F7 和0xFFFFFFF7

  • 隐式类型转换
    • 在混合类型的算数表达式中,最宽的数据类型成为目标转换类型
    • 用一种类型的表达式赋值给另一种类型的对象,目标准换类型是被赋值对象的类型
    • 把一个表达式传递给一个函数,目标转换类型是形式参数的类型
    • 从一个函数返回一个表达式,目标转换类型是函数类型
  • 算数转换中的通用原则
    • 为防止精度丢失,总是提升为较宽类型
    • 小于整型的有序类型算数表达式在计算之前都转成整型

运算符问题

1.下面程序的结果?

#include <iostream>
using namespace std;int main() {unsigned char a=0xA5;unsigned char b=~a>>4+1;printf("b=%d\n", b);return 0;
}

解析:
b的值应该为((~a)>>(4+1)), 此时要进行算数运算就要涉及到一个“整数提升”的问题,也就是说a要转成int类型才能进行计算。
那么a转成了0x000000A5, 进行取反0xFFFFFF02, 右移5位后,赋给b,则b截取了最右边的8位为11111010, 最后按照整型的类型打印,无符号位高字节补0,则可以得到:250(十进制)
等号是最弱的会产生副作用的运算符,接着是移位,然后是四则运算,取值,单目运算等等等等



2.用一个表达式判断一个数x是否是2^N,不可用循环语句
解析:
!(X&(X-1))返回值为false说明是2的幂次方,否则不是



3.下面代码的作用?

int f(int x, int y) {return (x&y)+((x^y)>>1)
}

解析:
相同位的与 + 不同位的平均 = 两个数的平均值



4.利用位运算实现两个整数的加法运算
解析:
递归的思想,详细解释

int Add(int a, int b) {if (b == 0) return a;int sum = a^b;int carry = (a&b)<<1;Add(sum, carry);
}

a、b交换与比较

1.不使用"if"、"?:"、"switch"或其他判断语句,找出两个数中的最大值
解释:
方案一:利用abs函数

int max = (abs(a-b)+(a+b))/2;



方案二:判断差值的符号位



方案三:采用bool值

bool fun(int a, int b) {return a < b;
}int max(int a, int b) {bool flag = fun(a, b);return flag*b+(1-flag)*a;
}



3.有两个数据,写一个交换两个数据的宏
解释:
方案一:利用异或运算(不考虑浮点数)
define swap(a, b) {a=a^b; b= a^b; a=a^b;}


方案二:利用加减法
define swap(a, b) {a=a+b; b = a-b; a = a-b;}


方案三:内存交换

define swap(a, b) \
{char tempBuf[10]; memcpy(tempBuf, &a, sizeof(a));
memcpy(&a, &b, sizeof(b)); memcpy(&b, tempBuf, sizeof(b)); }

C和C++的关系

  • c++语言支持函数重载,c语言不支持。c++通过加extern"C",调用c编译后的函数
  • ifndef/define/endif 是条件编译的一种,防止头文件重复引用、防止重定义(变量、宏或结构)
  • c是结构化的语言,重点在数据结构和算法,首先要考虑如何通过一个过程,对输入产生输出。
  • c++首先要考虑如何构造一个对象模型来解决问题。

程序设计的其他问题

这个就还是多刷刷题目吧,注意一些小细节就好啊,考虑问题要全面


-from 《程序员面试宝典》

转载于:https://www.cnblogs.com/zengyh-1900/p/5227903.html

相关文章:

使用多线程还是用IO复用select/epoll? epoll 或者 kqueue 的原理是什么?

原作者&#xff1a;蓝形参 原文&#xff1a;http://www.zhihu.com/question/20114168/answer/14024115 使用多线程还是用IO复用select/epoll? 多线程模型适用于处理短连接&#xff0c;且连接的打开关闭非常频繁的情形&#xff0c;但不适合处理长连接。多线程模型默认情况下…

使用大batch优化深度学习:训练BERT仅需76分钟 | ICLR 2020

作者 | Yang You, Jing Li等译者 | 刘畅在海量数据集上训练大型深度神经网络&#xff0c;是非常具有挑战性的。最近&#xff0c;有许多研究均使用大batch随机优化方法来解决此问题。在该研究领域中&#xff0c;目前最杰出的算法是LARS&#xff0c;它通过采用分层自适应学习率&a…

华为AR28-11路由器配置

公司使用华为AR28-11路由器&#xff0c;宽带接入。现使用2M光纤接入&#xff0c;地址&#xff1a;124.117.254.* 255.255.255.252.公司电脑使用192.168.1.0 255.255.255.0 网段地址参考配置#version 5.20, Release 1205P02, Basic#sysname H3C#domain default enable system#vl…

PHPExcel使用-使用PHPExcel导出文件-导出MySQL数据

现在数据库里面有一组数据&#xff0c;我们将它按照不同的难度进行分sheet. 首先我们需要写一个mysql的配置文件- db.config.php(utf-8编码) : <?php $dbconfig array( host > 127.0.0.1, username > root, password > , database > xxx, charset &…

C语言清空输入缓冲区的N种方法对比

C语言中有几个基本输入函数&#xff1a; //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 char *fgets(char * restrict s, int n, FILE * restrict stream); char *gets(char *s);//可能导致溢出&#xff0c;用fgets代替之…

低耗时、高精度,微软提基于半监督学习的神经网络结构搜索算法

作者 | 罗人千、谭旭、王蕊、秦涛、陈恩红、刘铁岩 来源 | 微软研究院AI头条&#xff08;ID:MSRAsia&#xff09;编者按&#xff1a;近年来&#xff0c;神经网络结构搜索&#xff08;Neural Architecture Search, NAS&#xff09;取得了较大的突破&#xff0c;但仍然面临搜索耗…

《虚拟化与云计算》读书感(三)数据中心的概述

看了《虚拟化与云计算》的第一章第一节‘数据中心的概述’。在我读这一节开始&#xff0c;我看到这个题目的时候总是联想到类似谷歌数据中心一类的东西&#xff0c;多个硬盘或者服务器的堆叠。然后整来几个集装箱把这些堆叠的服务器塞进去&#xff0c;然后供用户使用。然而自从…

golang笔记——struct

1、定义一个结构体 type User struct {userid intusername stringpassword string } 2、初始化一个结构体 有两种情况&#xff0c;一是得到结构体的对象&#xff0c;一是得到结构的对象指针&#xff0c;分别有三种方式&#xff1a; //第1种方式&#xff0c;先声明对象&#x…

posix_memalign

翻译的<Linux system programming> 第八章 二 ;《Linux System Programming》中文版 对齐 数据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系。一个变量的地址是它大小的倍数的时候&#xff0c;这就叫做自然对齐(naturally aligned)。例如&…

ubuntu 10.04 安装eclipse及其中文语言包

1.安装eclipsesudo apt-get install eclipse2.暗自中文语言包点 击下载中文语言包&#xff08;http://www.eclipse.org/downloads/download.php?file /technology/babel/babel_language_packs/BabelLanguagePack-eclipse- zh_3.5.0.v20091121043401.zip&urlhttp://d2u376u…

世界顶级赛事百万座位如何做到票务限时匹配?

作者 | 阿里文娱技术专家 展恒出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;背景麦座&#xff0c;是大麦旗下的票务系统。去年&#xff0c;我们承接了 2019 年国际篮联篮球世界杯&#xff08;2019FBWC&#xff09;&#xff0c; 核心目标是完成三种套票的运营及售卖…

[转](不理想)Ubuntu下更改主显示器

参考链接&#xff1a;http://www.cnblogs.com/feng_013/archive/2012/03/05/2380111.html 查看显示器信息&#xff1a; fdmfdm-OptiPlex-780:~$ xrandr 设置主显示器 fdmfdm-OptiPlex-780:~$ xrandr --output HDMI1 --auto --primary 设置副显示器在主显示器右边 fdmfdm-OptiPl…

Nginx源码分析--数据对齐posix_memalign和memalign函数

posix_memalign函数() /* * 背景&#xff1a; * 1&#xff09;POSIX 1003.1d * 2&#xff09;POSIX 标明了通过malloc( ), calloc( ), 和 realloc( ) 返回的地址对于 * 任何的C类型来说都是对齐的 * 功能&#xff1a;由posix_memalign分配的内存空间&…

不要一辈子靠技术生存

今天看了一篇文章,感受挺深的,人的一生不能一辈子靠技术生存,尽管你的技术能力很强.(文章转载出处忘记,有哪位朋友知道的提醒一下)一、 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇&#xff0c;你千万更不要认为哪些从事 市场开发&#xff0c;跑腿的人&am…

中国顶尖的技术社区们在一个群里,会聊什么…

* 文中表情包图片来自网络

矩阵中路径数目问题

在如下8*6的矩阵中&#xff0c;请计算从A移动到B一共有____种走法。要求每次只能向上或向右移动一格&#xff0c;并且不能经过P。 8*6的矩阵&#xff0c;从左下角A到右上角B&#xff0c;一共需要走12步&#xff0c;其中5步向上&#xff0c;7步向右&#xff0c;因此总的走法一共…

RANet : 分辨率自适应网络效果和性能的best trade-off | CVPR 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记简介深度CNN带来了性能提升的同时也带来了过高的计算量&#xff0c;许多研究放在了如何进行网络加速上面&#xff0c;其中比较直接的是根据样本难易程度进行自动调整的自适应网络。基于对自适应网络的研究&#xff0c;论文提出了自适…

strcpy,memcpy和memmove区别

strcpy和memcpy都是标准C库函数&#xff0c;它们有下面的特点。 strcpy提供了字符串的复制。即strcpy只用于字符串复制&#xff0c;并且它不仅复制字符串内容之外&#xff0c;还会复制字符串的结束符。 已知strcpy函数的原型是&#xff1a;char* strcpy(char* dest, const cha…

WinForm 读写配置文件

读配置文件 方法(1) //ConfigurationManager.RefreshSection("appSettings");stringsettingValue ConfigurationManager.AppSettings.Get("setting1");读配置文件 方法(2) Configuration config ConfigurationManager.OpenExeConfiguration(ConfigurationU…

PHP 读取数据库内容并以二维数组按指定列输出实例

最新PHP 读取数据库内容并以二维数组按指定列输出实例以下是三零网为大家整理的最新PHP 读取数据库内容并以二维数组按指定列输出实例的文章&#xff0c;希望大家能够喜欢!<?php$host "localhost"; //主机名$user "root"; //mysql用户名$passwor…

指针的本质2-void和void*及其应用在nginx中的应用

指针本质论指针有两个属性:指向变量/对象的地址和长度。 但是指针只存储地址,长度则取决于指针的类型&#xff0c;编译器根据指针的类型从指针指向的地址向后寻址&#xff0c; 指针类型不同则寻址范围也不同&#xff0c;比如: int*从指定地址向后寻找4字节作为变量的存储单元&…

首次揭秘!大麦如何应对超大规模高性能选座抢票?

作者| 阿里文娱技术专家恒磊、高级开发工程师新钱出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;背景介绍随着现场娱乐行业的不断发展&#xff0c;各类演出层出不穷&#xff0c;越来越多的演出开启选座购票满足用 户的自主选座需求。大麦的选座不仅面向中小场馆类的…

华为交换机密码恢复

华为交换机密码恢复说明&#xff1a;以下方法将删除原有config文件&#xff0c;使设备恢复到出厂配置。在设备重启时按CtrlB进入BOOT MENU之后&#xff0c;Press Ctrl-B to enter Boot Menu... 5Password : 缺省为空&#xff0c;回车即可1. Download application file to flash…

nginx源码分析--内存对齐处理

1.nginx内存对齐主要是做2件事情&#xff1a; 1) 内存池的内存地址对齐&#xff1b; 2) 长度按照2的幂取整.因为前面结构体已经是对齐了&#xff0c;如果后面的内存池每一小块不是2的幂&#xff0c;那么后面的就不能对齐 2.通用内存对齐理论 内存对齐&#xff1a;数据项只能…

七喜携手AMD,摆脱英特尔“潜规则”

七喜携手AMD&#xff0c;摆脱英特尔“潜规则”<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />最近&#xff0c;在PC市场随着七喜董事副总裁毛骏飙揭发英特尔制定的潜规则&#xff0c;“游戏规则都是英特尔制定的&#xff0c;全…

半小时训练亿级规模知识图谱,亚马逊AI开源知识图谱嵌入表示框架DGL-KE

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 知识图谱 &#xff08;Knowledge Graph&#xff09;作为一个重要的技术&#xff0c;在近几年里被广泛运用在了信息检索&#xff0c;自然语言处理&#xff0c;以及推荐系统等各种领域。学习知识图谱的嵌入表示 &#x…

数组的各类排序

1 package sort;2 3 /**4 * 数组的各种排序操作5 * Created by liuwei on 16/3/6.6 */7 public class MSort {8 9 /**10 * 直接插入排序11 * 外层一个循环,从第2个元素开始(下标为1),遍历后面的所有元素12 * 内层一个循环,从当前位置position i 开始,每次…

Virtualbox安装使用注意

1.VirtualBox升级到4.3以后不能打开 提示创建 COM 对象失败 应用程序将被中断 解决方案&#xff1a;右键VirtualBox的桌面快捷方式&#xff0c;选择属性&#xff0c;选到兼容性选项卡&#xff0c;勾选“以兼容模式运行这个程序”&#xff0c;下拉框选择Windows Server 2008 …

机器学习项目模板:ML项目的6个基本步骤

来源 | DeepHub IMBA每个机器学习项目都有自己独特的形式。对于每个项目&#xff0c;都可以遵循一组预定义的步骤。尽管没有严格的流程&#xff0c;但是可以提出一个通用模板。准备问题不仅是机器学习&#xff0c;任何项目的第一步都是简单地定义当前的问题。您首先需要了解背景…

ib_logfile 在数据库中有何作用?

ib_logfile 在数据库中有何作用&#xff1f; ib_logfile0/ib_logfile1 文件在数据库中起什么作用&#xff1f; 如果被删除&#xff0c;对数据库有何影响&#xff1f; ----->>>>>>>>>>> 回复 #1 mugua_xinli 的帖子 用于存放InnoDB引擎的事…