我最近遇到一个案例,我需要比较两个文件(黄金和预期)来验证测试结果,即使写入两个文件的数据相同,文件也不匹配.
在进一步调查中,我发现有一个结构包含一些整数和一个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) 我有以下代码片段:
int i[] = {42, i[0]};
Run Code Online (Sandbox Code Playgroud)
是允许这样的初始化还是导致未定义的行为?
三大编译器(GCC,铛,MSVC)给我42的i[1].因此看起来合法,但我希望从这个案例的标准中看到一个引用.
我有以下内容:
typedef struct
{
uint8_t BlockID;
uint32_t Copies;
uint16_t Size;
}NVMM_ConfigType;
const NVMM_ConfigType NvmmCnf_Layout[6] =
{
{ 1, 1, 4},
{ 2, 3, 4},
{ 5, 5, 16},
{ 10, 1, 4},
{ 11, 2, 32},
{ 13, 1, 100},
};
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很好,但是,MISRA-C给出了以下错误:
MISRA C:2012规则10.3违规:[R]表达式的值不得分配给具有较窄基本类型或不同基本类型类别的对象
我试图弄清楚为什么会这样,但我只能看到它.在类似的情况下,构建结果也会受到这种错误的困扰,我不知道为什么.
有人知道发生了什么吗?
编辑:我也尝试显式转换每个值仍然得到相同的错误:
const NVMM_ConfigType NvmmCnf_Layout[6] =
{
{ (uint8_t)1, (uint32_t)1, (uint16_t)4},
{ (uint8_t)2, (uint32_t)3, (uint16_t)4},
{ (uint8_t)5, (uint32_t)5, (uint16_t)16},
{ (uint8_t)10, (uint32_t)1, (uint16_t)4},
{ (uint8_t)11, (uint32_t)2, (uint16_t)32},
{ (uint8_t)13, (uint32_t)1, (uint16_t)100},
};
Run Code Online (Sandbox Code Playgroud) 我刚刚看了这篇SO帖子:
然而,哥伦比亚大学教授的笔记就是这样做的.见第9页.
Foo foos = new Foo[12] ;
Run Code Online (Sandbox Code Playgroud)
哪种方式是正确的?他们似乎说不同的事情.
特别是,在笔记版本中没有[].
我想初始化数组的所有成员为零,或 nullptr
struct Window{ int a;};
int main()
{
Window* list[4] = { 0, 0, 0, 0 };
Window* list2[4] = {0};
Window* list3[4] = {};
Window* list4[4]{ 0, 0, 0, 0 };
Window* list5[4]{0};
Window* list6[4]{};
}
Run Code Online (Sandbox Code Playgroud)
据我所知,当将至少一个成员初始化为任何值时,所有其他成员都初始化为零,所以如果我这样做:
int list[4] = { 6 };
Run Code Online (Sandbox Code Playgroud)
第一个成员变为6,所有其余成员都是零初始化.我很困惑:
int list[4]{0};
Run Code Online (Sandbox Code Playgroud)
和
int list[4]{};
Run Code Online (Sandbox Code Playgroud)
我假设在没有等号的声明之后的空的波浪形括号是所谓的零初始化,而不是默认初始化,但也是如此int list[4]{0},不是吗?这是否涉及std::initializer_list到幕后?我以为这些只用于非POD类型,所以std::initializer_list这里没有使用?
默认情况下,引用类型数组初始化,所有引用都为null.
是否有任何语法技巧来使用新的默认对象初始化它们?
例如
public class Child
{
}
public class Parent
{
private Child[] _children = new Child[10];
public Parent()
{
//any way to negate the need for this?
for (int n = 0; n < _children.Length; n++)
_children[n] = new Child();
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道我是否可以在这里以某种方式轻松获得if语句:
public Object[] tableItemFromVisit(Visit visit, boolean editable) {
return new Object[] {
visit.getIdVisit(),
visit.getProfession().getProfessionName(),
visit.getSpiProfessional().getFullName(),
RegularFunctions.getTimeFormat().format(visit.getVisitDate()),
RegularFunctions.toNormalCapitalizedText(visit.getVisitState()
.toString()), visit.getReason(),
if (editable) { "Edit" },
};
}
Run Code Online (Sandbox Code Playgroud)
这个结构怎么称呼?数组规范还是什么?无论如何,如果变量"editable"为真,它必须有一个"编辑"字符串,如果它是假的,它不需要任何东西......显然我不想写两个太过类似的返回语句彼此...
当我们初始化这样的数组时int a[5] = {0},编译器会使所有5个元素为0.这是非常好的,紧凑的初始化和有用的功能.
但我想知道为什么编译器没有int a[5]={1}类似的初始化?为什么它不能使所有5个元素1?为什么标准不强制要求?它不是一个很棒的功能吗?不是不见了?
此外,如果初始化程序中的元素数小于数组的大小,则编译可以使用初始化程序中的最后一个元素初始化剩余的元素.手段,int a[5]={1,2,3}相当于int a[5]={1,2,3,3,3}.同样,int a[10]={1,2,3,0}相当于int a[10]={1,2,3,0,0,0,0,0,0,0};.
如果标准要求,这一切都不是一个很棒的功能吗?或者这个缺失的功能有什么好的理由吗?
并且在C99中有一个称为指定初始化程序的东西,其用途如下:
指定的初始值设定项可以与常规初始值设定项结合使用,如下例所示:
int a[10] = {2, 4, [8]=9, 10}在该示例中,a [0]被初始化为2,a 1被初始化为4,a [2]至a [7]被初始化为0,并且a [9]被初始化为10.
很有趣.但即便是这个功能也不在C++中.
c++ arrays language-features language-design array-initialization
你好我是C编程语言的初学者,最近我开始学习数组,我研究过默认情况下int数组中的所有值都是垃圾.
那么为什么我在这两种情况下得到不同的价值观.
情况1
int arr[5];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,从arr [0]到arr [4]我们将有垃圾值,但在下一种情况下.
案例2
int arr[5] = {1};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,arr [0]将具有值1,并且从arr [1]到arr [4]的剩余值将为0.
我的问题是,在case-1中,每个未初始化的阵列位置都有垃圾valeus,那么为什么在2-case剩余的未初始化阵列位置具有0作为默认值.