在'declare&initialize'部分使用运算符“/=”

Posted

技术标签:

【中文标题】在\'declare&initialize\'部分使用运算符“/=”【英文标题】:Using operator "/=" at 'declare&initialize' part在'declare&initialize'部分使用运算符“/=” 【发布时间】:2019-02-06 02:53:15 【问题描述】:

我是一名最近对计算机科学感兴趣的学生。我正在学习 C++,因为我对嵌入式系统感兴趣。

当我尝试自己测试运算符/= 时。我想通过做来了解它。我写的代码是

int a /= --b + 3;

但是编译器给了我一个错误信息。但是当我将其修改为

int a = 0;
a /= --b + 3;`

效果很好。我认为它与左值和右值有关。为什么操作员/= 的第一个示例给我一个错误但上面的第二个示例没问题?我可以请您提供一些参考以获取有关此问题的提示吗?

PS:当我测试时

int t = t / (--a + 3);

效果也很好!有什么不同?你能给我指出一些关于这方面的文件吗?

【问题讨论】:

您希望结果是什么? int t=t/(--a+3); 不能“正常工作”——它具有未定义的行为,因为您在 t 的值之前使用了它。一个体面的编译器会警告你。 阅读minimal reproducible example。我相信您可以将示例缩减为int main() int a /= 2; int b = 4; b /= 2; int c = c / 2;。 (想想当你在每种情况下划分它时变量可能具有什么值。) 感谢您的帮助!我会参考那个文件!谢谢! 关于结果是:预期:0(下一行)1(下一行)0实际:行“int a /= --b + 3;”显示错误“在 /= 之前没有 ;” 【参考方案1】:

我想提两点。

这段代码是什么意思? 它是有效的 C++ 语法吗?

让我们看看两者。

当我测试“int a/=--b+3”时,它有错误但是当我修改为“int a=0;”时

a/=--b+3;" ,效果很好。

与 Java 不同,C/C++ 不会自动将整数的值初始化为 0,它包含一个 garbage value(官方称为“不确定值”)。所以int a/=--b+3; 更像int a; a/=--b+3; 仍然是一个没有意义的值。

而且当你声明一个变量时,C/C++ 语法不允许/=。以下是变量声明和初始化的方法。我不确定还有其他方法。

int a = 1; int a(1); int a1; (C++11 起)

【讨论】:

您可能应该使用适当的术语“不确定值”并提到读取不确定值是未定义的行为。 – 我不确定还有更多方法。int a; ^^ 感谢您的帮助!所以它可能与C++的属性和初始化有关!谢谢! @Swordfish 我之前没有听说过官方术语“不确定值”。刚刚更新了我的答案。谢谢! What is [an] Indeterminate Value?【参考方案2】:
a /= b;

等同于:

a = a / b;

所以这意味着下面的陈述没有意义:

int a /= (--b + 3);

因为它相当于:

int a = a / (--b + 3);

假设这里已经定义了b;问题是 a 尚未定义,因此不能用作分配的一部分。

这里的问题和这个语句的问题是一样的:

int a = a;

这也解释了为什么下面的代码确实工作:

int a = 0;
a /= (--b + 3);

因为它相当于这样:

int a = 0;
a = a / (--b + 3);

因为a 在上面的第二行中是已知的,所以可以定义RHS,并确定a 的新值。

更一般地,在变量初始化期间不应使用 /=*=+=-=%= 等运算符。如果您尝试这样做,编译器(例如 g++)应该以错误响应。

【讨论】:

感谢您的帮助!所以,你的意思是变量'a'之前没有在初始化时声明,所以造成了问题?对吗? 是的。 "/=" 不能与初始化一起使用。编译器应该提供一个错误,因为这没有意义。 我明白了!感谢您的帮助! @정지수,我很高兴听到这个消息。如果您发现我的回复回答了您的问题,请考虑将其标记为答案(我的回复旁边的绿色勾号)。 感谢您的帮助!

以上是关于在'declare&initialize'部分使用运算符“/=”的主要内容,如果未能解决你的问题,请参考以下文章

'for' loop initial declarations are only allo

error: ‘for’ loop initial declarations are only allowed in C99 mode

IAR 一直显示 Warning[Pe223]: function "gpio_initial" declared implicitly

解决Dev-C++ [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode

解决Dev-C++ [Error] ‘for‘ loop initial declarations are only allowed in C99 or C11 mode

initialization & finalization