我尝试了以下简单的C程序,但它在运行时崩溃而没有提供任何输出.这有什么不对?我怎么解决这个问题?
#include <stdio.h>
#include <string.h>
int main(void)
{
char *s1="segmentation";
char *s2="fault";
char *s3=strcat(s1,s2);
printf("concatanated string is %s",s3);
}
Run Code Online (Sandbox Code Playgroud) 考虑以下程序.
#include <iostream>
int main()
{
int a=int{};
std::cout<<a;
}
Run Code Online (Sandbox Code Playgroud)
它是使用聚合初始化还是默认初始化?我很迷惑.
我知道auto关键字的含义已完全从C++ 11中改变.但是最近我编写了一个简单的程序,在编译=std=c++98选项时可以编译和运行.
#include <iostream>
void fun(auto int a)
{
a=3;
std::cout<<a<<'\n';
}
int main()
{
fun(3);
}
Run Code Online (Sandbox Code Playgroud)
Orwell Dev C++ IDE给出了如下警告:
[Warning] 'auto' changes meaning in C++11; please remove it [-Wc++0x-compat]
Run Code Online (Sandbox Code Playgroud)
那么,auto用于函数参数是否可以,或者我是否应该auto像上面的程序一样使用它来保持与C++ 11的兼容性?
考虑以下计划:
#include <iostream>
void f(void* a)
{
std::cout<<"(void*)fun is called\n";
std::cout<<*(int*)a<<'\n';
}
int main()
{
int a=9;
void* b=(int*)&a;
f(b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我像这样更改函数调用语句:
f(&b);
它仍然可以在运行时编译精细和崩溃.为什么?是什么原因?我不应该得到编译时错误吗?因为调用函数的正确方法是f(b).对?另外,为什么允许将NULL传递给参数类型为(void*)的函数?
如果我遗漏了某些东西或者对错误的理解,请纠正我.
我正在使用Orwell Dev C++ 5.8.3 IDE.它使用g ++ 4.8.1编译器.当我保存我的C++程序文件时,它会显示几个文件扩展名,用于保存我的C++程序文件.cpp, .cc, .cxx, .c++, .cp.
我选择哪个扩展名是否重要?
这些扩展是编译器/ IDE特定的还是特定于平台的?
我使用的是Windows 7操作系统.
这些扩展是否也可以在Unix或Linux等其他操作系统上使用和/或有效?
为什么提供这么多扩展?
是什么原因?
我读的怪C++的功能,称为大约一个注入的类名 在这里.
我试过按照简单的程序
#include <iostream>
class test
{
int s{3};
public:
int get_s()
{ return s; }
};
int main() {
class test::test s; // struct test::test s; also allowed. Why???
std::cout<<s.get_s();
}
Run Code Online (Sandbox Code Playgroud)
如果我在main()程序的第一行用struct替换class关键字仍然编译并运行正常.在这里查看现场演示.为什么?我不应该得到编译错误吗?为什么编译好?
这看起来很简单,但我的朋友和我一起辩论,下面的程序会调用UB.但我认为他是不正确的.考虑以下计划:
#include <iostream>
int main()
{
int* p=new int[3]();
int* q=p;
for(int i=0;i<3;i++)
std::cout<<q[i]<<' ';
delete[] q;
std::cout<<'\n';
}
Run Code Online (Sandbox Code Playgroud)
这个程序的行为是否定义得很好?如果我写delete [] p会发生什么?而不是删除[] q; ?有效吗?
考虑遵循Java程序:
abstract class Surprising
{
void fun()
{
System.out.println("fun() is invoked");
}
}
class myclass
{
public static void main(String args[])
{
Surprising s=new Surprising() { };
s.fun();
}
}
Run Code Online (Sandbox Code Playgroud)
这里我创建了我的抽象类令人惊讶的无名子类的对象,而不是抽象类的对象,因为它不允许在Java中创建抽象类的对象.
什么是等效的C++程序?是否可以在C++中执行此操作?如果是,怎么回事,为什么不允许?
我正在阅读为什么复制构造函数有多个参数?.
接受的答案说:
旧std::basic_string的确有一个:
basic_string(const basic_string& s,
size_type pos = 0, size_type n = npos)
Run Code Online (Sandbox Code Playgroud)
但是http://www.cplusplus.com/reference/string/basic_string/basic_string/说:
basic_string (const basic_string& str, size_type pos, size_type len = npos,
const allocator_type& alloc = allocator_type());
Run Code Online (Sandbox Code Playgroud)
上面不是复制构造函数,而是子串构造函数,它复制str从字符位置开始pos并跨越len字符的部分.
C++标准部分说:
如果X类的第一个参数是X&,const X&,volatile X&或const volatile X&,并且没有其他参数或者所有其他参数都有默认参数,则X类的非模板构造函数是一个复制构造函数
那么,该链接的接受答案是否不正确?这是子串的真正basic_string类构造函数吗?我已经在链接上检查了C++ 98,C++ 11和C++ 14规范中的原型并显示了相同的内容.
考虑以下程序编译并运行正常:
#include <iostream>
#include <string>
using std::string;
struct BB
{
// generic cast
template<typename T>
operator T() const
{
std::cout<<"Generic cast\n";
return 0;
}
// string cast
operator string() const
{
std::cout<<"string cast\n";
return string("hello");
}
};
int main()
{
BB b;
string s = b; // copy constructor
}
Run Code Online (Sandbox Code Playgroud)
但如果我稍微更改main()函数的代码如下:
int main()
{
BB b;
string s;
s = b;
}
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误消息(请参阅此处的实时演示)
[Error] ambiguous overload for 'operator=' (operand types are 'std::string {aka std::basic_string<char>}' and 'BB') …Run Code Online (Sandbox Code Playgroud) c++ ×9
pointers ×2
string ×2
arrays ×1
auto ×1
c ×1
c++11 ×1
g++ ×1
inheritance ×1
java ×1
parameters ×1
pure-virtual ×1
stdstring ×1
strcat ×1