我需要您的帮助以获取Linux gcc 4.4.7
中的以下警告for (int iLoop1= 0; iLoop1< iLoopN; ++iLoop1, ++iLoop2, !iIsOk)
我在最后一个逗号
之后的最后一个参数中发出以下警告error: right-hand operand of comma has no effect
我已经阅读了逗号运算符的wiki页面,但我不明白这个问题 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
答案 0 :(得分:5)
!iIsOk
虽然经过评估,但没有做任何事情;即删除它将对该程序完全没有影响。
您有用的编译器会警告您。
您是不是要将!iIsOk
写为循环中停止条件的一部分:
iLoop1< iLoopN && iIsOk
或使用
切换 iLoop1++, iIsOk = !iIsOk
或更闪亮(由于变量重复较少,我个人觉得更清楚)
iLoop1++, iIsOk ^= true
答案 1 :(得分:2)
首先,让我告诉你警告信息背后的原因。根据逗号运算符属性,来自C11
,章节§6.5.17(强调我的)
逗号运算符的左操作数被计算为void表达式;有一个 其评估与右操作数之间的序列点。 然后是右边 操作数被评估;结果有其类型和价值。
因此,在这种情况下, final RHS操作数是.... , !iIsOk
,为此,生成的值未使用。因此警告。您需要使用该值,或者您可以删除该语句,因为它在当前状态下,它对程序没有任何影响。
如上所述,正如tilz0R和Bathsheba中的其他答案所述,根据您的“具体”要求,该声明应为iIsOk = !iIsOk
,但我建议将这是循环体中的最后一个语句,为了便于阅读。
答案 2 :(得分:0)
!iIsOk
应为iIsOk = !iIsOk
。
如果C包含i++
或++i
之类的运算符,那么您使用!iIsOk
执行的操作不会执行任何操作。如果你想要结果,你必须在某个地方做出贡献。
要否定变量,请使用iIsOk = !iIsOk;
,您将获得所需的效果。