我对以下代码中发生的事情感到有点困惑:
const int e = 2;
int* w = ( int* ) &e; // (1) cast to remove const-ness
*w = 5; // (2)
cout << *w << endl; // (3) outputs 5
cout << e << endl; // (4) outputs 2
cout << "w = " << w << endl; // (5) w points to the address of e
cout << "&e = " << &e << endl;
Run Code Online (Sandbox Code Playgroud)
在(1)中,w指向e的地址.在(2)中,该值变为5.但是,当显示*w和e的值时,它们的值不同.但是如果你打印w指针和&e的值,它们具有相同的值/地址.
为什么e仍然包含2,即使它被改为5?他们存放在一个单独的位置?还是暂时的?但是,为什么w指出的价值仍然是e的地址?
我的C++知识有些零碎.我正在重新编写一些代码.我更改了一个函数来返回对类型的引用.在里面,我根据传入的标识符查找对象,然后返回对象的引用(如果找到).当然,如果我找不到对象,我会遇到要返回的问题,并且在环顾网络时,许多人声称在C++中返回"空引用"是不可能的.基于这个建议,我尝试了返回成功/失败布尔值的技巧,并使对象引用为out参数.但是,我遇到了需要初始化我将作为实际参数传递的引用的障碍,当然也没有办法做到这一点.我退回到通常只返回指针的方法.
我问了一位同事.他经常使用以下技巧,这是最新版本的Sun编译器和gcc都接受的:
MyType& someFunc(int id)
{
// successful case here:
// ...
// fail case:
return *static_cast<MyType*>(0);
}
// Use:
...
MyType& mt = somefunc(myIdNum);
if (&mt) // test for "null reference"
{
// whatever
}
...
Run Code Online (Sandbox Code Playgroud)
我一直在维护这个代码库,但我发现我没有足够的时间来查找我想要的语言的小细节.我一直在挖掘我的参考书,但这个答案让我望而却步.
现在,我在几年前开设了一门C++课程,其中我们强调在C++中,一切都是类型,所以我在考虑事情时会尽量记住这一点.解构表达式:" static_cast <MyType >(0);",在我看来,我们确实采用了字面零,将其转换为指向MyType的指针(使其成为空指针),然后应用解除引用运算符分配给引用类型(返回类型)的上下文,它应该为我提供对指针指向的同一对象的引用.这看起来像是向我返回一个空引用.
任何解释为什么这个工作(或为什么不应该)的建议将不胜感激.
谢谢,查克
在以下代码中,变量没有初始值并打印此变量.
int var;
cout << var << endl;
Run Code Online (Sandbox Code Playgroud)
输出:2514932
double var;
cout << var << endl;
Run Code Online (Sandbox Code Playgroud)
输出:1.23769e-307
我不明白这些输出数字.任何人都可以向我解释一下吗?
这被认为非常简单,但我无法从键盘读取连续输入.
这是代码:
#include <string.h>
#include <stdio.h>
int main()
{
char string[200];
char character;
printf ("write something: ");
scanf ("%s", string);
printf ("%s", string);
printf ("\nwrite a character: ");
scanf ("%c", &character);
printf ("\nCharacter %c Correspondent number: %d\n", character, character);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
怎么了
当我输入一个字符串(例如:计算机)时,程序会读取换行符('\n')并将其放入character.以下是显示的外观:
write something: computer
computer
Character:
Correspondent number: 10
Run Code Online (Sandbox Code Playgroud)
此外,该程序不适用于包含多个单词的字符串.我怎么能克服这些问题?
在编写C++代码时,我突然意识到我的数字被错误地转换double为unsigned long long.
具体来说,我使用以下代码:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <limits>
using namespace std;
int main()
{
unsigned long long ull = numeric_limits<unsigned long long>::max();
double d = static_cast<double>(ull);
unsigned long long ull2 = static_cast<unsigned long long>(d);
cout << ull << endl << d << endl << ull2 << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在我的计算机上执行此代码时,我有以下输出:
18446744073709551615
1.84467e+019
9223372036854775808
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)
我期望第一个和第三个数字完全相同(就像在Ideone上一样),因为我确信它long double占用了10个字节,并将尾数存储在其中的8个中.我会理解,如果第三个数字与第一个数字相比被截断 - 只是因为浮点数格式的错误.但这里的价值是两倍不同!
所以,主要的问题是:为什么?我怎样才能预测出这种情况呢?
一些细节:我在Windows 7上使用Visual Studio …
原始数据类型的大小究竟int取决于什么?
或者它是这些或其他因素的组合?
对其原因的解释将非常有帮助.
编辑:对不起混淆..我想询问关于原始数据类型如int而不是关于POD,我确实理解POD可以包括结构和结构它是一个完全不同的球游戏与填充进入图片.我已经更正了Q,这里的编辑说明应该确保关于POD的答案看起来不相关.
通常人们会对正在编码的特定平台做出假设,例如,有符号整数使用两个补码存储,或者那个(0xFFFFFFFF == -1)或那些性质的东西.
是否存在可以检查代码库以查找最常见的违反这类事件的工具(对于我们这些想要可移植代码但没有奇怪的非二进制补充机器的人)?
(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣)
几天前我接受了一次采访,我被要求在C中编写一个程序,该程序崩溃系统/关闭系统.毋庸置疑,我觉得非常愚蠢,不知道如何接近:(
我还是试了一下,编写了使用大量内存的程序.但我的采访者对我的任何技术都不满意.
请看一下这段代码:
#include <stdio.h>
int main(void)
{
short s;
int i = 65696;
float f = 65696.0F;
printf("sizeof(short) = %lu\n", sizeof(short));
s = i;
printf("s = %hd\n", s);
s = f;
printf("s = %hd\n", s);
s = 65696;
printf("s = %hd\n", s);
s = 65696.0F;
printf("s = %hd\n", s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给出了输出:
sizeof(short) = 2
s = 160
s = 160
s = 160
s = 32767
Run Code Online (Sandbox Code Playgroud)
在最后一行为什么它是32767而不是160?说f = 65696.0F; s = f;和之间有什么区别s = 65696.0F;?
有人可以向我解释以下代码输出:
void myprint(unsigned long a)
{
printf("Input is %lx\n", a);
}
int main()
{
myprint(1 << 31);
myprint(0x80000000);
}
Run Code Online (Sandbox Code Playgroud)
输出gcc main.c:
Input is ffffffff80000000
Input is 80000000
Run Code Online (Sandbox Code Playgroud)
为什么被(1 << 31)视为签名并被0x80000000视为未签名?