zoukankan      html  css  js  c++  java
  • 关于 C 的 arithmetic conversion (进行 算术运算 时的 强制转换规则)

     那本书里面都有啊啊!!

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2015-3-17更新~~~~~~~~~~~~~~~~~~~ 

    先上两个解释我的疑惑的链接:

    http://en.cppreference.com/w/cpp/language/operator_arithmetic

    https://msdn.microsoft.com/en-us/library/3t4w2bkb.aspx

    开始我是看 <<Expert C programming -- Deep C Secrets>>这本书(中文译作 C专家编程), chapter 1 里面的how quite is a quite change 这一小节, 有这样一段代码:

    #include <stdio.h>

    int main()
    {
        if(-1 < (unsigned char)1)
            printf("-1 is less than (unsigned char)1: ANSI semantics. ");
        else
            printf("-1 is NOT less than (unsigned char)1: K&R semantics. ");
        return 0;

    } 

     我用了vs2013和gcc 4.9.1分别去编译运行, 都是ANSI的语义.打印第一条语句.

    然后改成这样

     #include <stdio.h>


    int main()
    {
        if(-1 < (unsigned int)1)//或者是unsigned
            printf("1111111111. ");
        else
            printf("222222222222222. ");
        return 0;
    }

    gcc 4.9.1编译运行(未加任何特殊编译选项)的结果是打印第二条. 而vs2013默认编译不通过, error:负数转变成了无符号数.

    开始看 <<Expert C programming -- Deep C Secrets>>这本书这里时有点偷懒, 只记得了这两句话:

          Operands with different types get converted when you do arithmetic. Everything is converted to the type of the floatest, longest operand, signed if possible without losing bits. 

    gcc警告强度开大一点就好了 

    sh-4.3gcc -o main *.c -Wall                                                               
    sh-4.3gcc -o main *.c -Wall -Wextra                                                       
    main.c: In function 'main':                                                                 
    main.c:5:11: warning: comparison between signed and unsigned integer expressions [-Wsign-com
    pare]                                                                                       
         if(-1 < (unsigned ) 1)                                                                  

               ^        

     实际上完整的规则还是本文开头的哪两个链接靠谱.

    我觉得 best practice应当是尽量少用强制转换,  谁想去记忆那些无聊的规则. 

  • 相关阅读:
    js向input的value赋值
    报错:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin' for key 'username'
    php下intval()和(int)转换使用与区别
    laravel 文件上传总结
    js实现图片上传到服务器和回显
    PHP feof() 函数
    laravel insert 、save、update、create区别(总结二)
    【MySQL经典案例分析】 Waiting for table metadata lock
    使用Laya引擎开发微信小游戏(下)
    一文带你看懂cookie,面试前端不用愁
  • 原文地址:https://www.cnblogs.com/likeatree/p/4345159.html
Copyright © 2011-2022 走看看