我有一个简单的函数,其中一个数组声明大小取决于参数int.
void f(int n){
char a[n];
};
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码在GNU C++上编译得很好,但在MSVC 2005上却没有.
我收到以下编译错误:
.\main.cpp(4) : error C2057: expected constant expression
.\main.cpp(4) : error C2466: cannot allocate an array of constant size 0
.\main.cpp(4) : error C2133: 'a' : unknown size
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能纠正这个问题?
(我有兴趣使用MSVC,而不使用new/delete)
例:
my $some_variable;
my @some_variable;
my %some_variable;
Run Code Online (Sandbox Code Playgroud)
我知道,@似乎是为了数组,$对于原始,它是完全正确的吗?什么是%?
在Java中,如何创建在构造时填充的最终Set?我想做类似以下的事情:
static final Set<Integer> NECESSARY_PERMISSIONS
= new HashSet<Integer>([1,2,3,6]);
Run Code Online (Sandbox Code Playgroud)
但我不知道Java中的正确语法.
我想知道的区别def,cdef而cpdef当我宣布一个功能.def和其他人之间的区别或多或少都很明显.而且我也看到有时它在声明(cdef void/double/int... name)中添加了返回类型,有时却没有.
我也想知道如何在cython中声明一个字符串变量,因为我不知道它,我把它声明为对象.
我知道标题似乎很愚蠢,但我认为值得一提.
以此声明(或定义,可能)为例:
_Thread_local long volatile static int _Atomic const long unsigned x = 10;
Run Code Online (Sandbox Code Playgroud)
我以前认为long long是一种类型,但如果它是一个类型名称,那么如何插入这么多限定符呢?
所以我用这个问题咨询了N1570,只是更加困惑.它提到了一些术语,如" type-specifier "和" type-qualifier ",我long long在"类型说明符"中找不到,但long long在C中不是原始类型?有这么多书告诉我了!
澄清不重复:
是的,我看到了存在的问题与交易long int long,但这个问题有什么做预选赛,并且是C.
枚举类型的声明有什么意义?它是在枚举名称后面吗?我看过Standard C++ 14(n4296)§3.3.2/ 3:
枚举的声明点紧跟在enum-specifier(7.2)或其第一个opaque-enum-declaration(7.2)中的标识符(如果有)之后,以先到者为准
但是当我试图重现它时;
template <class T>
struct CL
{
using UndType = int;
};
enum class E: CL<E>::UndType; //error: E is undefined
Run Code Online (Sandbox Code Playgroud)
我在所有编译器上都有一个错误,虽然枚举的枚举E位置在标识符之后并且必须是可见的.
这是我的测试代码:
class Test {
init {
a = 1
}
constructor() {
a = 2
}
private var a: Int
init {
a = 3
}
}
Run Code Online (Sandbox Code Playgroud)
如果我删除辅助构造函数:
class Test {
init {
a = 1 // Error: Variable cannot be initialized before declaration
}
// constructor() {
// a = 2
// }
private var a: Int
init {
a = 3
}
}
Run Code Online (Sandbox Code Playgroud)
我知道
在实例初始化期间,初始化程序块的执行顺序与它们在类主体中出现的顺序相同.
但是,如果存在辅助构造函数,为什么我可以在声明之前初始化变量?
更新:
我发现了一件有趣的事:
class Test {
init {
a = log(1)
}
constructor() …Run Code Online (Sandbox Code Playgroud) 这是一个真正的初学者问题(我还在学习Java基础知识).
我可以(有点)理解为什么方法会返回List <String>而不是ArrayList <String>,或者为什么它们会接受List参数而不是ArrayList.如果它对方法没有影响(即,如果不需要ArrayList中的特殊方法),这将使该方法更灵活,更容易用于调用者.其他集合类型也是如此,例如Set或Map.
我不明白的是:通常的做法是创建这样的局部变量:
List<String> list = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
虽然这种形式不太常见:
ArrayList<String> list = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)
这有什么好处?
我只能看到一个小缺点:必须添加java.util.List的单独"import"行.从技术上讲,可以使用"import java.util.*",但我也不经常看到,可能是因为某些IDE自动添加了"import"行.
这个例子是在C#中,但我希望可以轻松地应用于其他人.
我最近发现以下似乎工作正常:
int i = Int32.TryParse(SomeString, out i) ? i : -1;
Run Code Online (Sandbox Code Playgroud)
不知怎的,似乎变量i在技术上不应该在它出现的时候可访问TryParse.或者我是否正确地假设int i有效地声明变量,即使声明还没有结束呢?
当声明在C指针,有2个(编辑:3)的变体:
变式A:
__CODE__
变式B:
__CODE__
变式C:
__CODE__
声明指针的方式因我阅读的文档类型而异.一些作者似乎偏好某些变体,其他人使用几种变体.