在'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