7

我原以为这将是一个通过 Google 轻松解决的问题,但我似乎找不到明确的(甚至是推测的)答案:

使用比较器语句时,隐式转换发生的顺序是什么?

int i = -1;
size_t t = 1;

bool result = i < t;

这是否等同于:

bool result = i < int(t);    // equals true

或者:

bool result = size_t(i) < t;    // equals false

这是问题的简单部分 - 第二部分是“一般规则是什么”,因为它可能是:

  1. “更简单”的参数总是被转换成“更复杂”的参数(即 size_t->int),或者
  2. 第一个(或第二个)参数始终转换为第二个(或第一个)参数的类型,或
  3. 诸如 size_t 和 ints 之类的内置原语具有特定的比较器运算符,它们指定逐个转换。

这三个似乎都是合理的,尽管第二个会产生与大多数人直觉预期的明显不同的行为。

当您将 int 与 size_t 进行比较时,VC++ 编译器似乎认为值得发出 3 级警告 - 但是当您从返回 size_t 的函数返回负数时它只会给出 4 级警告(这会导致数字只是超过返回的最大整数的一半)。

为了摆脱所有 4 级警告,我现在无论如何都明确地投射了所有内容,但我想知道“真相”。这必须在某处定义......


尝试发布包含 XML 的 JSON 数据时,Http Post 失败

我正在尝试使用以下功能发布 http 帖子。它适用于我的帖子数据包含正常的 JSON 数据(只是文本)。但现在我的 json 数据在其中一个字段中也包含 xml。

 public string postJSON(string username, string password, string endPoint, string json)
    {
        HttpWebRequest request = CreateWebRequest(endPoint, "POST", "text/json");
        request.Credentials = new NetworkCredential(username, password);
        try
        {
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();
                var httpResponse = (HttpWebResponse)request.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                    return result;
                }
            }
        }
        catch (Exception ex)
        {
            logger.WriteToLog("RequestMaker", "postJason function: " + ex.Message);
            return "error";
        }          
    }

但是当我尝试这样做时,我收到了一个错误的 url 错误 (400)。我的端点 URL 如下所示: http : //se.api.anpdm.com/v1/import/mailinglist/#####/demographicmapping/### 并且必须发布的示例 Json 代码如下所示。

"{\"XMLData\":\"<Subscribers><Subscriber><Name>Pedram</Name><Email>mobedi@live.com</Email><DemographicData><Demographic mapTo='Urval'>30</Demographic></DemographicData></Subscriber><Subscriber><Name>Anders Svensson</Name><Email>pmobedi@yahoo.com</Email><DemographicData><Demographic mapTo='Urval'>27</Demographic></DemographicData></Subscriber></Subscribers>\"}"

还有什么我应该做的吗?

4

2 回答 2

10

规则相当复杂,并且取决于实施。然而,基本上:

  1. 这两种类型都是“提升”的。这意味着任何小于 的东西int都会被提升为int. size_t(在小于的不太可能的情况下int,它将被提升为有符号的int,并失去其无符号性。)

  2. 如果其中一种类型可以包含另一种类型的所有值,则另一种类型将转换为此类型。

  3. 如果其中一种类型是无符号的,而另一种是有符号的,并且它们具有相同的大小,则将有符号转换为无符号。

对于intand size_t(必须是无符号的),这意味着除非size_t小于int,否则int将转换为 a size_t

于 2013-01-30T12:35:15.960 回答
4

$18.2/6- size_t 类型是实现定义的无符号整数 类型,它大到足以包含任何对象的字节大小。

$5.9 - 否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则具有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型。对于第一部分,在 C++ 标准指定的转换之前,bool 被提升为 int。

因此,这意味着 'i' 被转换为 'size_t' 的类型(假设 size_t 的类型为 'unsigned int' 或更大)。然后将“unsigned int”类型的结果转换为“bool”(即 的类型result)。

请注意,标准规定的等级signed intunsigned int相同。

有关转换/升级的确切规则,请参阅 C++ 标准的第 4 节和第 5 节。

于 2013-01-30T12:27:04.830 回答