多声明中的第二个int是否始终设置为1?

Fel*_*bek 9 c declaration definition undefined-behavior variable-declaration

这篇Code Golf帖子中,声称"定义中的第二个变量始终设置为1",这使得它成为一个格式良好的行:

int i=-1,c,o,w,b,e=b=w=o=c;
Run Code Online (Sandbox Code Playgroud)

据说除了i设置为1 之外的所有内容c都是自动1.

我以为我知道一些C,并认为这是非法的(是UB,如果有任何随机堆栈内容的结果).

C真的设置c为1吗?

dbu*_*ush 5

此代码显示未定义的行为.

变量c,o,b,和w是未初始化的.这意味着他们的内容是不确定的.

C标准第6.7.9节开始:

10如果未显式初始化具有自动存储持续时间的对象,则其值不确定.

然后将不确定值c分配给其他几个变量.通过读取未初始化变量的值,代码将调用未定义的行为.

初始值c 可以是1,但如果是,那么它不是可预测的值.

还要注意的是,上述语句同时包含初始化(对于ie)和分配(c,o,bw),因此该语句将不会在文件范围编译.

我试图在链接的帖子中运行该函数,但它没有通过第一个测试输入.未定义的行为.


Alb*_*haw 5

我是CodeGolf的OP.似乎我只是有一个拼写错误,我的意思是说 int i=-1,c,o,w,b,e=b=w=o=c=1; 第二个定义的int总是设置为1而其他的可以设置为它.令人困惑的是,我最初接下来的变量(L = 3)只是l(未定义)而我将所有其他变量设置为e = b = w = o = c =(L = 3); 在我看来,将L设置为等于3,为此返回true(1),然后将其余设置为1.

稍后我进行了一些测试,我意识到这只是将它们全部设置为3并且仅使用我用来测试代码的特定字符串.所以我删除它们并将其更改为L = 3硬编码,其他则为e=b=w=o=c=1;L=3.在某些时候我必须多次按下cmd + z并删除"="和"1"所以我只是留下了e=b=w=o=c;.由于这个一致的未定义特性(至少在我的IDE上),它总是将它们定义为0,因此bug没有被注意到.

现在我已经纠正了它,感谢这篇文章,字节长度是相同的,并且不需要任何这个棘手的e=b=w=o=c=1代码,我只想到字节长度不同,因为当我将我的函数粘贴到一个字节计数器显示它小了2个字节(我不知道我只是有一个错字并且缺少2个字节).

我的IDE总是将这些变量定义为0.我的代码被设计为与定义为1的所有变量一起工作,它与w/0一起工作的事实是巧合.也只是因为它发生在我的IDE上并不意味着它会在其他人身上,虽然我已经在几个IDE上测试它现在在线并运行许多循环它似乎总是返回0.无论如何,我仍然更新我的原始代码将它们设置为1应该是(向我的程序添加2个字节).

感谢大家的投入

  • 有了这样的问题,你期望得到一个答案:"这就是UB,烧掉那个在标准C++的祭坛上编写这段代码的人"或"这是一个惊人的技巧,揭示了C++的一个黑暗角落".然后你来了,就像"嗨伙计们,所以......是的,我犯了一个CTRL-Z的错误......"这是......非常虎头蛇尾......哦.它发生:) (3认同)