C和指针 第5章 操作符和表达式 5.8 问题

本文详细探讨了C语言中各种操作符和表达式的使用,包括浮点除法、位操作、条件操作符、循环、位移、位运算的副作用等。通过实例解析了操作符的优先级、副作用及其在不同情况下的行为,帮助读者深入理解C语言中的这些关键概念。
摘要由CSDN通过智能技术生成

1.下面这个表达式的类型和值分别是什么?
    (float)(25 / 10);
解析:
#include <stdio.h>
#include <stdlib.h>

int main( void ){
    printf( "sizeof( (float)(25 / 10) ) = %zd, (float)(25 / 10) = %f, "
    "sizeof( float ) = %zd\n", sizeof( (float)(25 / 10) ), (float)(25 / 10), sizeof( float ) );

    return EXIT_SUCCESS;
}
输出:

2.下面这个程序的结果是什么? 
int func( void ){
    static int counter = 1;
    return ++counter;

int main( void ){
    int answer;
    
    answer = func() - func() * func();
    printf( "%d\n", answer );
    
    return EXIT_SUCCESS;
}
解析:
这是一个狡猾的问题。比较明显的回答是-10(2 - 3 * 4),但实际上它因编译器而异。乘法运算必须在加法运算之前完成,但并无规则规定函数调用完成的顺序。因此,下面几个答案都是正确的:
-10 (2 - 3 * 4) or (2 - 4 * 3)
-5 (3 - 2 * 4) or (3 - 4 * 2)
-2 (4 - 2 * 3) or (4 - 3 * 2) 
下面是DEV-C++编译器的答案:
#include <stdio.h>
#include <stdlib.h>

int func( void ){
    static int counter = 1;
    return ++counter;

int main( void ){
    int answer;
    
    answer = func() - func() * func();
    printf( "%d\n", answer );
    
    return EXIT_SUCCESS;
}
输出:

3.位操作符和移位操作符可以用在什么地方? 
解析:
位操作符可以用在让某一位置为1,或者让某一位为0。
移位操作符可以用在进行更快的乘除法,两者结合起来可以用来查看值在内存中的表现形式。 

4.条件操作符在运行时比较时较之if语句是更快还是更慢?试着比较下面两个代码段。 
if( a > 3 ){
    i = b + 1;
} else{
    i = c * 5;
}
i = a > 3 ? b + 1 : c * 5;
解析:
不,它们都执行相同的任务。如果你比较吹毛求疵,使用if的哪个方案看上去稍微臃肿一些,因为它具有两条存储到i的指令。但是,它们之间只有一条指令才会执行,所以在速度上并无差别。
#include <stdio.h>
#include <stdlib.h>

int main( void ){
    int a = 5;
    int b = 6;
    int c = 2;
    int i;
    
    if( a > 3 ){
        i = b + 1;
    } else{
        i = c * 5;
    }
    printf( "1:use if statement:i = %d, a = %d, b = %d, c = %d\n", i, a, b, c );
    
    i = a > 3 ? b + 1 : c * 5;
    printf( "2:use ?: operator:i = %d, a = %d, b = %d, c = %d\n", i, a, b, c );

    return EXIT_SUCCESS;
}
输出:

5.可以被4整除的年份是闰年,但是其中能够被100整除的年份又不是闰年。但是,这其中能够被400整除的年份又是闰年。请写一条赋值语句,实现如下功能:如果变量year的值是闰年,把变量leap_year设置为真;如果year的值不是闰年,把leap_year设置为假。
解析:
#include <stdio.h>
#include <stdlib.h>

int main( void ){
    int leap_year = 0; /*第1种方法需要假定其不是闰年*/
    int year;
    
    year = 2900;
    if( year % 4 == 0 ){
        leap_year = 1;
    }
    if( year % 4 == 0 && year % 100 == 0 ){
        leap_year = 0;
    }
    if( year % 4 == 0 && year % 100 != 0 ){
        leap_year = 1;
    }
    if( year % 4 == 0 && year % 100 == 0 && year % 400 == 0 ){
        leap_year = 1;
    }
    printf( "method01: %d year is %s year.\n", year, leap_year == 1 ? "leap" : " not leap " );
    /* 更优秀的解法,即最先考虑最特殊的情况 */
    if( year % 400 == 0 ){
        leap_year = 1; 
    } else if( year % 100 == 0 ){
        leap_year = 0;
    } else if( year % 4 == 0 ){
        leap_year = 1;
    } else{
        leap_year = 0;
    }
    printf( "method02: %d year is %s year.\n", year, leap_year == 1 ? "leap" : " not leap " );

    return EXIT_SUCCESS;
}
输出:

6.哪些操作符具有副作用?它们具有什么副作用? 
解析:
()操作符并无任何副作用,但它所调用的函数可能有副作用。
操作符         副作用
++,--            不论是前缀还是后缀形式,这些操作符都会修改它们的操作数
=                 包括所有其它的复合赋值符:它们都修改作为左值的左操作数
#include <stdio.h>
#include <stdlib.h>

int main( void ){
    int a = 1, b = 1;
    int prefix_a;
    int b_post;
    
    printf( "a 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值