相关疑难解决方法(0)

153
推荐指数
5
解决办法
3万
查看次数

具有名为main的全局变量而不是main函数的程序如何工作?

考虑以下计划:

#include <iostream>
int main = ( std::cout << "C++ is excellent!\n", 195 ); 
Run Code Online (Sandbox Code Playgroud)

在Windows 7操作系统上使用g ++ 4.8.1(mingw64),程序编译并运行正常,打印:

C++非常棒!

到控制台.main似乎是一个全局变量而不是一个函数; 如果没有该功能,该程序如何执行main()?这段代码是否符合C++标准?程序的行为是否定义明确?我也使用了该-pedantic-errors选项,但该程序仍然编译并运行.

c++ program-entry-point language-lawyer

97
推荐指数
5
解决办法
9849
查看次数

如果在一行中声明了两个对象,它们的构造顺序是什么?

假设一个类被定义为

class A {
//.....
};
Run Code Online (Sandbox Code Playgroud)

现在我正在创建两个对象

A a,b;
Run Code Online (Sandbox Code Playgroud)

按照什么顺序ab创造的呢?它是由标准定义的吗?

c++ declaration object-construction language-lawyer

63
推荐指数
5
解决办法
4248
查看次数

逗号运算符有什么作用?

以下代码在C/C++中的作用是什么?

if (blah(), 5) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

c c++ operators comma-operator

40
推荐指数
4
解决办法
2520
查看次数

逗号分隔的值列表用括号括起来在C中表示什么?a =(1,2,3);

我刚刚遇到了基本上执行以下操作的代码:

int a = (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

我以前从未见过这种表示法.这是什么意思?

c c++ comma

19
推荐指数
4
解决办法
2173
查看次数

为什么将括号括在逗号分隔值列表周围会改变赋值?

请考虑以下代码,

    int i;

    i = 1,2,3,4,5;
    printf("First time i = %d\n",i);

    i = (1,2,3,4,5);
    printf("Second time i = %d\n",i);   
Run Code Online (Sandbox Code Playgroud)

输出:

第一次i = 1

第二次i = 5


为什么括号使逗号运算符取最后一个值而没有括号它取第一个值?

提前致谢.

c c++ syntax

18
推荐指数
4
解决办法
2324
查看次数

c ++中的逗号运算符不计算第二个表达式

我写了以下代码:

#include <iostream>
using namespace std;

int f()
{
    cout << "f()" << endl;
    return 3;
}

int v()
{
    cout << "v()" << endl;
    return 4;
}

int main()
{
    int m = f(),v();
    cout << m << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望它打印:

f()
v()
3
Run Code Online (Sandbox Code Playgroud)

编译g++ -O0 test.cpp -o test.out并运行结果:

f()
3
Run Code Online (Sandbox Code Playgroud)

为什么省略对v的调用?(这不能做优化,因为我添加了标志-O0)

c++ comma-operator

15
推荐指数
1
解决办法
466
查看次数

带有typeid的逗号运算符

我正在研究一种通用的非侵入式智能指针实现.我在第4节中有些困惑.一个声明是

仅当结果类型是多态类类型的左值时,才计算作为typeid运算符的参数提供的表达式.

相关的示例代码是:

template<typename T>
  void* startOfObject(T* p) {
  void* q=static_cast<void*>(p);
  typeid(q=dynamic_cast<void*>(p),*p); // This line
  return q;
}
Run Code Online (Sandbox Code Playgroud)

AFAIU,它意味着q=dynamic_cast<void*>(p)如果结果类型多态类类型左值,则将对其进行评估.该结果意味着评价的结果dynamic_cast<void*>(p)(我想),所以dynamic_cast在任何情况下被应用.文章陈述(据我所知),如果p不是多态的dynamic_cast就不会应用,但为什么呢?在应用它之前,如何知道结果是否是多态的?如果有人详细描述了如何执行完整的语句,将会很有帮助.

另一种说法是

如果p为NULL也存在问题 - typeid将抛出std :: bad cast.

我看到的问题是取消引用,如果pNULL,而不是typeid(虽然它可能抛出bad_typeid,但这不是因为转换).dynamic_cast会返回一个NULL类型的指针void*,如果pNULL,而且typeid应该能够推断出类型的信息.这是一个错字,还是我错过了什么?

c++ dynamic-cast comma typeid

15
推荐指数
3
解决办法
681
查看次数

如何编写一个使用迭代器和索引计数器的for循环?

我有一个看起来像这样的函数:

void myclass::myfunc()
{
    int i;
    for( std::vector<Foo>::iterator it = var.begin(), i = 0; it < var.end(); it++, i++ )
    {
        /* ... */
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

无法转换intstd::_Vector_iterator<>

这段代码有什么问题?

c++ for-loop stl

14
推荐指数
2
解决办法
4702
查看次数

括号中的两个字符串在C++中用逗号分隔

可能重复:
C++逗号运算符

我今天遇到了意外(至少对我来说)C++行为,由以下snippit显示:

#include <iostream>

int main()
{
  std::cout << ("1", "2") << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

2
Run Code Online (Sandbox Code Playgroud)

这适用于括号之间的任意数量的字符串.在visual studio 2010编译器和键盘上测试.

我想知道为什么这首先编译,这个'功能'的用途是什么?

c++ string comma parentheses

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