相关疑难解决方法(0)

通过非const指针修改const

我对以下代码中发生的事情感到有点困惑:


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++ pointers casting const-correctness

13
推荐指数
2
解决办法
1021
查看次数

此代码似乎实现了在C++中返回空引用

我的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的指针(使其成为空指针),然后应用解除引用运算符分配给引用类型(返回类型)的上下文,它应该为我提供对指针指向的同一对象的引用.这看起来像是向我返回一个空引用.

任何解释为什么这个工作(或为什么不应该)的建议将不胜感激.

谢谢,查克

c++

13
推荐指数
4
解决办法
2019
查看次数

当我打印未初始化的变量时,为什么会看到奇怪的值?

在以下代码中,变量没有初始值并打印此变量.

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

我不明白这些输出数字.任何人都可以向我解释一下吗?

c++ variables initialization c++-faq

13
推荐指数
2
解决办法
7771
查看次数

使用scanf()从键盘读取时读取前一输入的换行符

这被认为非常简单,但我无法从键盘读取连续输入.

这是代码:

#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 string char

13
推荐指数
2
解决办法
1万
查看次数

从无符号long long转换为double,反之亦然,可以更改值

在编写C++代码时,我突然意识到我的数字被错误地转换doubleunsigned 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)

Ideone现场例子.

在我的计算机上执行此代码时,我有以下输出:

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 …

c++ floating-point casting

13
推荐指数
1
解决办法
4699
查看次数

原始数据类型的大小

原始数据类型的大小究竟int取决于什么?

  • 编译器
  • 处理器
  • 发展环境

或者它是这些或其他因素的组合?
对其原因的解释将非常有帮助.

编辑:对不起混淆..我想询问关于原始数据类型如int而不是关于POD,我确实理解POD可以包括结构和结构它是一个完全不同的球游戏与填充进入图片.我已经更正了Q,这里的编辑说明应该确保关于POD的答案看起来不相关.

c c++ sizeof

11
推荐指数
2
解决办法
9508
查看次数

是否有任何C++工具可以检查常见的未指定行为?

通常人们会对正在编码的特定平台做出假设,例如,有符号整数使用两个补码存储,或者那个(0xFFFFFFFF == -1)或那些性质的东西.

是否存在可以检查代码库以查找最常见的违反这类事件的工具(对于我们这些想要可移植代码但没有奇怪的非二进制补充机器的人)?

(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣)

c++ unspecified-behavior

10
推荐指数
1
解决办法
208
查看次数

AC程序使系统崩溃

几天前我接受了一次采访,我被要求在C中编写一个程序,该程序崩溃系统/关闭系统.毋庸置疑,我觉得非常愚蠢,不知道如何接近:(

我还是试了一下,编写了使用大量内存的程序.但我的采访者对我的任何技术都不满意.

c

10
推荐指数
1
解决办法
2519
查看次数

隐式地抛出一个浮点常数

请看一下这段代码:

#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;

c floating-point casting

10
推荐指数
1
解决办法
209
查看次数

无符号和签名扩展

有人可以向我解释以下代码输出:

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视为未签名?

c unsigned language-lawyer

10
推荐指数
2
解决办法
1816
查看次数