请看以下示例:
private int[] list;
public Listing() {
// Why can't I do this?
list = {4, 5, 6, 7, 8};
// I have to do this:
int[] contents = {4, 5, 6, 7, 8};
list = contents;
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能使用速记初始化?我能想到解决这个问题的唯一方法是制作另一个数组并设置list为该数组.
我们正在将C代码转换为C++.
我注意到以下代码在C中定义得很好,
int main(){
//length is valid. '\0' is ignored
char str[3]="abc";
}
Run Code Online (Sandbox Code Playgroud)
正如在Array初始化中所述:
"如果数组的大小已知,它可能比字符串文字的大小小一个,在这种情况下,终止空字符将被忽略."
但是,如果我要在C++中构建相同的代码,我会收到以下C++错误:
error: initializer-string for array of chars is too long
[-fpermissive] char str[3]="abc";
Run Code Online (Sandbox Code Playgroud)
我希望有人可以对此进行阐述.
问题:
代码示例是否在所有C语言标准中都有效?
它在所有C++语言标准中都无效吗?
是否有一种语言在一种语言中有效而在另一种语言中无效?
在初始化可变长度数组编译器时会给出错误消息:
[Error] variable-sized object may not be initialized
Run Code Online (Sandbox Code Playgroud)
代码段:
int n;
printf("Enter size of magic square: ");
scanf("%d",&n);
int board[n][n] = {0};
Run Code Online (Sandbox Code Playgroud)
如何初始化可变长度数组?为什么所有元素都没有0按照以下方式初始化;
int board[n][n];
board[n][n] = {0};
Run Code Online (Sandbox Code Playgroud)
?
因为我喜欢Split() strings,所以我经常使用
new char[] { ';' }
Run Code Online (Sandbox Code Playgroud)
或类似的参数Split().
在编译时是否有任何创建带有一个元素的字符数组的快捷方式?不是我介意打字,但......
以下代码让我困惑:
Object[] arr1 = new String[]{"a", "b", "c"};
Object[] arr2 = {"a", "b", "c"};
String[] a = (String[]) arr1; // ok
String[] b = (String[]) arr2; // ClassCastException
System.out.println(arr1.getClass().getName()); // [Ljava.lang.String;
System.out.println(arr2.getClass().getName()); // [Ljava.lang.Object;
Run Code Online (Sandbox Code Playgroud)
我试图理解为什么两个初始化彼此不同.第一个是帖子声明,第二个是捷径.这两个都被宣布为Object[]
我天真的理解是:
Object[] arr2 = {"a", "b", "c"}; // is a syntax sugar of
Object[] arr2 = new Object[] {"a", "b", "c"};
Run Code Online (Sandbox Code Playgroud)
因此运行时类型arr2正好Object[]无法转换为String[].
但是,事情就变得怪怪的,因为Java数组是协变:
String[]是的子类Object[],并arr2确切地是String[],从后面投射Object[]到String[]上arr2应该工作.
对此的任何解释都非常感谢.
我有一组2D数组.例如,它就像:
{{{0, 0, 1}, {1, 0, 0}}
{{0, 0, 3}, {2, 1, 2}, {2, 2, 1}, {3, 0, 0}}
{{0, 0, 7}, {3, 2, 6}, {6, 2, 3}, {6, 3, 2}, {7, 0, 0}}}
Run Code Online (Sandbox Code Playgroud)
但如果我写
int [,][] arrays={{{0, 0, 1}, {1, 0, 0}}
{{0, 0, 3}, {2, 1, 2}, {2, 2, 1}, {3, 0, 0}}
{{0, 0, 7}, {3, 2, 6}, {6, 2, 3}, {6, 3, 2}, {7, 0, 0}}};
Run Code Online (Sandbox Code Playgroud)
编译器会抱怨";期望".
如果我写
int [,][] arrays={new int[,] {{0, 0, 1}, {1, …Run Code Online (Sandbox Code Playgroud) c# initialization multidimensional-array array-initialization
在Ruby中,我可以做类似的事情:
["FOO", "BAR"].each do { |str| puts str }
Run Code Online (Sandbox Code Playgroud)
迭代我正在使用它的语句中定义的数组.因为我可以在Java中定义一个数组,如:
String[] array = { "FOO", "BAR" };
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过设置一个循环来避免定义变量:
for (String str : new String[] { "FOO", "BAR" }) { ... }
Run Code Online (Sandbox Code Playgroud)
但是,我希望java可能有更简洁的东西,没有先定义包含数组的变量,并且还允许我避免动态分配,是否有如下语法:
for (String str : { "FOO", "BAR" }) { ... }
Run Code Online (Sandbox Code Playgroud)
这更简洁,适用于我缺少的Java,或者是我的唯一选择之上的解决方案?
我需要将数组的每个元素初始化为非常量表达式.我是否可以这样做而无需先将数组的每个元素初始化为一些无意义的表达式?以下是我希望能够做到的一个例子:
fn foo(xs: &[i32; 1000]) {
let mut ys: [i32; 1000];
for (x, y) in xs.iter().zip(ys.iter_mut()) {
*y = *x / 3;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
此代码给出了编译时错误:
error[E0381]: borrow of possibly uninitialized variable: `ys`
--> src/lib.rs:4:33
|
4 | for (x, y) in xs.iter().zip(ys.iter_mut()) {
| ^^ use of possibly uninitialized `ys`
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,我需要更改函数的第一行,ys用一些虚拟值初始化元素,如下所示:
let mut ys: [i32; 1000] = [0; 1000];
Run Code Online (Sandbox Code Playgroud)
有没有办法省略额外的初始化?将所有内容包装在unsafe块中似乎没有任何区别.
我最近遇到一个案例,我需要比较两个文件(黄金和预期)来验证测试结果,即使写入两个文件的数据相同,文件也不匹配.
在进一步调查中,我发现有一个结构包含一些整数和一个64字节的char数组,并且在大多数情况下并没有使用char数组的所有字节,并且数组中未使用的字段包含随机数据造成了不匹配.
这让我想问一个问题是,在C/C++中初始化数组是否也是一个好习惯,就像在Java中完成一样?
我喜欢c ++ 11可变参数模板,所以我经常用它编写一些小代码.
看这个例子:
#include <cstdio>
#include <type_traits>
#include <vector>
template< typename ... T >
auto make_vector(T ... t ) -> std::vector< typename std::common_type<T...>::type >
{
std::vector< typename std::common_type<T...>::type > v;
v.reserve( sizeof...(T) );
using list = int[];
(void)list{ 0, ( (void)v.push_back(std::move(t)) ,0)... };
// |/ / / /
// --------
// \-- How are evaluated v.push_back()s, sequentially or arbitrary ?
return v;
}
int main()
{
auto v = make_vector(2, 3.0, 'a', 7UL );
for(auto e : v ) …Run Code Online (Sandbox Code Playgroud)