警告:逗号的右侧操作数对 GCC 4.4.7 无效
warning: right-hand operand of comma has no effect gcc 4.4.7
我需要您的帮助才能在Linux gcc 4.4.7中出现以下警告
for (int iLoop1= 0; iLoop1< iLoopN; ++iLoop1, ++iLoop2, !iIsOk)
我有以下警告来自最后一个逗号之后的最后一个参数
error: right-hand operand of comma has no effect
我已经阅读了逗号运算符的维基页面,但我不明白这个问题https://en.wikipedia.org/wiki/Comma_operator
编辑:有效地!iIsOk什么都不做我已经测试了以下代码
// Example program
#include <iostream>
#include <string>
#include <iostream>
int main()
{
int iIsOk = 0;
for (int iLoop1 = 0; iLoop1 < 2; iLoop1++, !iIsOk)
{
std::cout << "IsOk=" << iIsOk << std::endl;
}
for (int iLoop1 = 0; iLoop1 < 2; iLoop1++, iIsOk = !iIsOk)
{
std::cout << "IsOk2=" << iIsOk << std::endl;
}
}
输出:
IsOk=0
IsOk=0
IsOk2=0
IsOk2=1
!iIsOk
虽然经过评估,但不会执行任何操作;即删除它对程序绝对没有影响。
有用的编译器会警告您这一点。
你的意思是将!iIsOk
写成循环中停止条件的一部分:
iLoop1< iLoopN && iIsOk
或使用
iLoop1++, iIsOk = !iIsOk
或更华丽(我个人觉得更清晰,因为变量重复更少(
iLoop1++, iIsOk ^= true
首先,让我告诉您警告消息背后的原因。根据逗号运算符属性,从 C11
第 §6.5.17 章(强调我的(
所以,在这里,在你的逗号运算符的左操作数被计算为 void 表达式;有一个 其评估值与正确操作数的计算之间的序列点。然后右边 计算操作数;结果有其类型和值。
例子中,最终的 RHS 操作数是 .... , !iIsOk
,对于它,产生的值是未使用的。因此警告。您需要使用该值,或者您可以删除该语句,因为在当前状态下,它对程序没有任何影响。
也就是说,正如tilz0R和Bathsheba的其他答案中提到的,根据您的"特定"要求,该语句应该是iIsOk = !iIsOk
但是为了可读性,我建议将其作为循环体中的最后一个语句。
!iIsOk
应该iIsOk = !iIsOk
。
如果 C 有像 i++
或 ++i
这样的运算符,你用 !iIsOk
做的事情什么也没做。如果你想要结果,你必须在某个地方断言它。
要否定变量,请使用iIsOk = !iIsOk;
,您将获得所需的效果。
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 警告:逗号的右侧操作数对 GCC 4.4.7 无效
- C 11螺纹 - 非静态成员功能的使用无效 - 工作GCC 5.1.0损坏的GCC 7.3.1
- gcc添加符号时出现无效版本(max)错误:值错误
- 忽略无效的转换错误,GCC
- 非常量引用类型的无效初始化中出错.在Linux操作系统中使用c++代码.GCC编译器
- 转换gcc-fpermission无效
- 字符串对的C++向量作为函数参数的默认规范在 gcc-4.1.2 上无效
- 你好世界在 GCC 5.3.0 上失败 /bin/ld:无效选项 -- 'p'
- 在 clang 中显式指定的参数无效,但在 gcc 中成功编译 — 谁错了?
- gcc中类型的非常量引用的初始化无效,但Visual Studio中没有
- GCC错误:从double*到const double的转换无效
- 指针算术编译失败,gcc指出类型转换无效
- 为什么 gcc 的选项"-Wstrict-prototypes"对C++无效?
- GCC-寄存器的使用无效
- 用gcc编译的visual C++在VC++14中是有效的和无效的
- 带有GCC优化的C++代码会导致字符串上的core具有无效的free()
- GCC 问题 - 从 'void (*)(MyObject*, bool)' 到 'const void*' 的转换无效