这个演员在C代码中取得了什么成就

时间:2016-11-09 15:05:20

标签: c casting

我对C Code相对较新,并试图解释这些C线的结果正在进行一些投射。

ASS_CODE是一个最多4个字符的字符串,可能是数字也可能不是数字,ASCII_ZERO是一个定义为48的常量,而ASCII_ONE是一个定义为49的常量。我猜这是试图强制某种类型根据ASS_CODE是数字还是其他方式的真或假结果,或者测试字符串是'0'还是'1',但不完全确定

 if ((int)(*ASS_CODE) == ASCII_ZERO)
       {
         calc_SDIS_EL13();
        }
         else if ((int)(*ASS_CODE) == ASCII_ONE)
        {
         do_gn11();
       } else
            {
               ........
            }
       }

3 个答案:

答案 0 :(得分:3)

char *ASS_CODEchar一样,是签名char或无签名intint更窄(其中1个几乎总是如此) )将被提升为48整数常量 int的类型为(int),因此无需使用强制转换char

在罕见的平台上,*ASS_CODEchar一样,int/unsigned*ASS_CODE一样宽。unsigned。作为待处理比较操作的一部分,unsigned被提升为48。将int整数常量 intunsigned)进行比较可能会警告您将bq partition mydataset.sharded_ mydataset.partitioned let term = termTextField.text! let answer = answerTextField.text! termAnswer.append((term,answer)) print(termAnswer.self) let newTA = CKRecord(recordType: "Terms") newTA["answers"] = answer as CKRecordValue? var publicData = CKContainer.default().publicCloudDatabase publicData.save(newTA, completionHandler: {(record, error) -> Void in if error == nil{ print("TA Saved") } else{ print("Not Saved") } }) newTA["terms"] = term as CKRecordValue? publicData = CKContainer.default().publicCloudDatabase publicData.save(newTA, completionHandler: {(record, error) -> Void in if error == nil{ print("TA Saved") } else{ print("Not Saved") } }) 进行比较。在这种情况下演员将安静警告。

答案 1 :(得分:0)

char ASS_CODE[4] = { ... };
#define ASCII_ZERO 48

if ((int)(*ASS_CODE) == ASCII_ZERO)

显然,这是非ASCII执行字符集的代码,或者是非常小心的开发人员。否则,ASCII_ZERO常量将不是必需的。

我首先想到的是char类型在该平台上等于unsigned char,并且需要使用强制转换来抑制编译器警告。但无论我如何定义常量,GCC都不会忽略任何警告。我试过这个:

enum { ASCII_ZERO = 48 };

void x() {
    char ASS_CODE[4] = {0};
    if (ASS_CODE[0] == ASCII_ZERO) {} else {}
}

下一个想法是代码必须符合某些行业标准,如MISRA。该标准可能要求每个二元运算符的左侧和右侧必须具有相同的类型。由于48具有类型int,因此必须将该字符强制转换为该类型。

答案 2 :(得分:0)

  

我试图解释正在进行某些演员的这些C行的结果。

     

[...]   ASS_CODE是一个最多4个字符的字符串,可能是数字也可能不是数字,ASCII_ZERO是一个定义为48的常量

     

[...]

if ((int)(*ASS_CODE) == ASCII_ZERO)

如果某个ASS_CODE的{​​{1}}类型为char *或类型为char[n],则n的类型为*ASSCODE,并评估为相同作为char - ie 的东西,字符串的第一个字符。宏ASS_CODE[0]展开的文字48表示类型ASCII_ZERO的值;具体来说,它是ASCII兼容字符编码中int字符的值。

强制转换运算符的优先级高于'0'运算符,因此在评估条件时,==(a *ASS_CODE)的值首先转换为char类型,然后与右手操作数(已经是int)进行比较。当int的第一个字符是数字1时(假设与ASCII兼容的编码),条件评估为ASS_CODE(true)。可以想象使用'0'而不是字符文字(ASCII_ZERO),因为即使在使用不同的字符编码时,也需要特别与 ASCII 0的意义进行比较。使用。无论如何,这就是产生的效果。

我推测,强制转换的原因是要使两个操作数具有相同的类型,或者只是强调比较是在'0'值上执行的。然而,它对程序的语义没有任何影响,因为int运算符的操作数无论如何都要在运算被评估之前进行“通常的算术转换”,在这种情况下,这将涉及转换即使没有显式演员,左手操作数也会==