-2

while(((long)(1000*ratio*((long)clock()-(long)t0))%100)/1000)<Data_Read_Rate);

上面的行正在生成以下错误:“< token 之前的语法错误”。

为什么会出现这个错误?

我使用 MINGW32 进行开发(GCC 编译器)。

谢谢...

4

7 回答 7

8

左侧缺少一个括号。这将解析:

while ((((long)(1000*ratio*((long)clock()-(long)t0))%100)/1000)<Data_Read_Rate);

除了解析问题:

  • 使用高亮匹配括号的编辑器:)
  • 为什么不计算直到数据读取率充分下降的剩余时间,然后调用 sleep()?这在处理器上更好。

此外,考虑到您使用 % 运算符,您可能希望像这样放置额外的括号(我假设ratio不是整数),因为 % 运算符需要整数操作数:

while (((long)(1000*ratio*(((long)clock()-(long)t0))%100)/1000)<Data_Read_Rate);

(但这在语义层面上有意义吗?砍掉它!)

于 2009-03-25T06:33:00.163 回答
4

你有太多的右括号。

另外,你的逻辑太长太深了,我懒得去弄清楚代码应该是什么。只是以红色vim突出显示最后一个,这意味着它不匹配。)我建议您考虑使用一些中间变量,并通过将其分散到几行而不是一行来简化该语句的逻辑。

于 2009-03-25T06:33:48.600 回答
3

括号不匹配。顺便说一句,我实际上会编辑代码并将其分解为多个语句以使其更具可读性。

于 2009-03-25T06:33:34.250 回答
2

因为编译器和人类读者一样对你的代码感到困惑?[不寒而栗]

空格和换行符是免费的,并且很好地增加了可读性。

    while ( ( (long)( 1000 * ratio * ( (long)clock() - (long)t0 ) ) % 100 ) / 1000 ) < Data_Read_Rate );

您也可以取消 clock() 和 t0 的(长)转换(假设它们都是 int )。在减法之前铸造它们不会改变结果。要使整个计算变长,将其中一个参数变长就足够了——而做到这一点的最短方法是转换文字 1000:

while ( ( ( 1000l * ratio * ( clock() - t0 ) ) % 100 ) / 1000 ) < Data_Read_Rate );

嗯……等等。你取一些东西,模 100(产生 0 到 99 之间的数字),然后除以 1000?你的结果总是0...

哦,你忘了匹配你的括号。;-)

于 2009-03-25T06:45:10.087 回答
1

如前所述,您的括号不匹配。

对于这样的表达式,使用一些临时变量来简化语句几乎总是更好。但是,以下提示可能会有所帮助。

  1. 计算括号,每个“(”加 1,每个“)”减 1,你应该总是得到 0 的答案。一个肯定的答案意味着你有一个额外的“(”一个否定的答案,你有一个额外的“)” .
  2. 重新格式化表达式以使其更易于阅读,可能会将其分成几行,每个逻辑语句都在一行。
  3. 使用语法高亮代码编辑器。这应该为您显示不匹配
于 2009-03-25T06:45:20.227 回答
0

您在左侧缺少一个括号。

于 2009-03-25T06:34:33.077 回答
0

你有太多的左括号和右括号。如果您使用的是 Visual Studio,它将帮助您使用 Ctrl+'[' 和 Ctrl+']' 按键匹配打开和关闭括号/大括号

另一个建议是通过保持表达式的可读性将其分组并分成多行。还尝试在后续括号之间留出空格,以便对表达式进行逻辑分组。

于 2009-03-25T06:42:52.587 回答