【问题标题】:Variable as parameter for if()变量作为 if() 的参数
【发布时间】:2017-05-16 01:31:53
【问题描述】:

我对编码还很陌生,并且对我最近遇到的程序的输出有疑问。代码如下:

#include <stdio.h>

int main(void) {
    unsigned char x = 16;
    x = x * 16;

    if (x) {
        printf("True.\n");
    }
    else {
        printf("False.\n");
    }

    return 0;
}

这个程序的输出显然是“False.\n”。我对此有两个问题:

  1. 如果条件语句的参数只是一个变量,这意味着什么?
  2. 为什么输出是“False.\n”?

谢谢!非常感谢任何建议或提示。

【问题讨论】:

  • 请阅读任何基本的 C 书籍或教程。这些是 C 基础知识比 Stackoverflow 更好的资源。但总而言之,0 在 C 中是假的,其他任何东西都是真的。结果为假,因为16*16 溢出了char,因此结果为0。
  • @kaylum 它是unsigned char。并且超出范围的赋值(不溢出)作为* 的操作数被提升为int。
  • if statement integer的可能重复
  • 试试printf("%d\n", (int)x);你会发现它打印0。

标签: c if-statement output


【解决方案1】:
unsigned char x = 16;

x 是一个unsigned char,在[0, 255] 范围内。

x = x * 16;

C99 standard(§6.2.5/9) 状态

涉及无符号操作数的计算永远不会溢出,因为无法由生成的无符号整数类型表示的结果会以比结果类型可以表示的最大值大一的数字为模减少。

x 等于 16 * 16 % 256 = 256 % 256 = 0。

if (x) {

对于不等于零的值,此语句应为true。 对于等于零的值,此语句应为 false,这就是您的情况。

【讨论】:

    【解决方案2】:

    x * 16 没有溢出。

    x 的值为 16。作为乘法的一部分,unsigned x 转换为 int,代码执行乘积为 256 的 int * int - 不会溢出。

    现在int 256 被分配给unsigned char。当某些 无符号整数 类型被分配一个超出其范围的值时,该值会以“max + 1”步或 256 减小/增加,直到它在unsigned char 的最大值范围内OP 的平台是 255。同样,没有溢出。值为 0。

    如果条件语句的参数只是一个变量,这意味着什么?
    为什么输出是“False.\n”?

    如果something 等于0,则if(something) 为false,否则为true。

    if (x) {
    //
    if (0) {
    //
    if (false) {
        ... // irrelevant
    } else {
        printf("False.\n");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2014-06-15
      • 2020-09-13
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多