【问题标题】:C: Errors with ParenthesesC:括号错误
【发布时间】:2015-03-24 12:15:48
【问题描述】:

所以我正在编写一系列函数,然后我尝试编译,我在谈论括号时遇到错误。我查看了我的代码,但找不到任何不匹配的括号。谁能告诉我我做错了什么>

int str_to_int(char* str)
{
  int sum = 0;
  int x;

  for(x=strlen(str) ; x>=2 ; x--) {

    if(30 <= str[x] <= 39) {
      sum += raise16((str[x] - 30) x);
    };

    if(41 <= str[x] <= 46) {
      sum += raise16((str[x] - 41) x);
    };

    if(61 <= str[x] <= 66) {
      sum += raise16((str[x] - 61) x);
     };
  }

  return sum;
}

【问题讨论】:

  • 我认为这个30 &lt;= str[x] &lt;= 39 不会像你认为的那样做,if 语句末尾的分号也不是必需的
  • 不要只告诉我们您有“关于括号的错误”。在您的问题中包含实际的错误消息。出于好奇,数字303941466166 的意义是什么?我认为您正在尝试识别 '0' ..'9''A' ..'F''a' ..'f' - 但这些是 十六进制这些字符的 ASCII 值。不要使用magic numbers;使用字符常量本身。
  • 10 &lt;= x &lt;= 20 这样的表达式实际上是合法的,但它并不意味着你认为它的意思。这意味着(10 &lt;= x) &lt;= 20,如果条件为假,(10 &lt;= x) 产生0,如果条件为真,则产生1。然后将 01 值与 20 进行比较。

标签: c syntax parentheses


【解决方案1】:

这是错误的

raise16((str[x] - 30) x)

也许你的意思

raise16((str[x] - 30) * x)

以及其他等效表达式。

而且,这种比较不会像你期望的那样起作用

if(30 <= str[x] <= 39)

什么会起作用

if ((str[x] >= 30) && (str[x] <= 39))

【讨论】:

    【解决方案2】:

    使用 && 连接两个条件,这里是更正的代码:

    int str_to_int(char* str)
    {
        int sum = 0;
        int x;
    
        for (x = strlen(str)-1; x >= 0; x--) {
            if (30 >= str[x] && str[x] <= 39) {
                sum += raise16((str[x] - 30)*x);
            } else if (41 >= str[x] && str[x] <= 46) {
                sum += raise16((str[x] - 41)*x);
            } else if (61 >= str[x] && str[x] <= 66) {
                sum += raise16((str[x] - 61)*x);
            }
        }
        return sum;
    }
    

    更正原因

    1. 条件if(61 &gt;= str[x] &amp;&amp; str[x] &lt;= 66) 用于示例检查 对于(61 &gt;= str[x])(str[x] &lt;= 66) 这两个条件。
    2. 我已更正索引以转到字符串中的所有字符 通过采取x as one less than length of string 并检查 对于x&gt;=0,字符串索引从 0 开始。
    3. 我已删除 ;在 if 条件的末尾,因为它们不是 必要的。
    4. 将 if 条件更改为 else if 条件 独家。

    【讨论】:

    • 也许您想向 OP 解释一下为什么要使用 &amp;&amp; 运算符并记下他错过了函数调用中的运算符以及 if 语句末尾的分号跨度>
    • (30 &gt;= str[x] &amp;&amp; str[x] &lt;= 39) -- &gt;= 应该是 &lt;=。而且数字都是错误的(请参阅我对问题的评论)。
    • 要通知用户,请使用“@KeithThomson”,否则他们可能看不到该消息。基思说的是对的。 if (30 &gt;= str[x] &amp;&amp; str[x] &lt;= 39) 与您的代码中的 if (str[x] &lt;= 30) 相同,这 不是 OP 想要的。
    • 我告诉过你使用“@username”来通知用户。而且你说的都是错的。他们是一样的。只有当str[x]&lt;=30
    • 为什么没有修复代码就删除了所有的cmets?这也让我们的 cmets 看起来不完整!
    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2019-01-04
    • 2014-07-03
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多