Printf: param transmit by lvalue and by rvalue - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Привет!
int output( DN2_INT const * const ss, tm const * const tm_info_ptr, bool reversed, bool quit )
{
    int _ss = *ss;
    int m = tm_info_ptr->tm_min;
    int h = tm_info_ptr->tm_hour;
    int s = tm_info_ptr->tm_sec;
    if ( tm_info_ptr && ss )
    {
        if ( !reversed )
            printf( "%d sekund je %d ur, %d minut, %d sekund\n", _ss, h, m, s );
        else
            printf( "%d ura, %d minut, %d sekund je %d sekund\n", h, m, s, _ss );
    }
    if ( quit )
    {
        getchar( );
        exit( 0 );
    }
}
Если заменить
printf( "%d sekund je %d ur, %d minut, %d sekund\n", _ss, h, m, s );
на
printf( "%d sekund je %d ur, %d minut, %d sekund\n", *ss, h, m, s );
, то вместо h будет всегда нуль! Почему так происходит?

Решение задачи: «Printf: param transmit by lvalue and by rvalue»

textual
Листинг программы
~/samples$ uname -m
x86_64
~/samples$ cat foo.c
#include <stdio.h>
 
void foo(long* val) {
 
    printf("%d", *val);
}
 
void bar(long* val) {
    int x = *val;
 
    printf("%d", x);
}
~/samples$ gcc -O2 -S foo.c
foo.c: В функции «foo»:
foo.c:5:2: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «long int» [-Wformat]
~/samples$ clang -O2 -S foo.c
foo.c:5:11: warning: conversion specifies type 'int' but the argument has type 'long'
      [-Wformat]
        printf("%d", *val);
                ~^   ~~~~
                %ld
1 warning generated.
~/samples$

Объяснение кода листинга программы

  1. В данном коде представлены две функции: foo и bar.
  2. Обе функции принимают аргумент типа long*.
  3. Внутри функции foo происходит вывод значения аргумента через функцию printf с форматом %d.
  4. Внутри функции bar происходит следующее: a. Значение аргумента приводится к типу int с помощью оператора (*val) в качестве выражения rvalue. b. Результат приведения типов сохраняется в переменной x. c. Выводится значение переменной x через функцию printf с форматом %d.
  5. Предоставлен результат выполнения команды gcc -O2 -S foo.c: a. Ошибка компиляции с предупреждением формата.
  6. Предоставлен результат выполнения команды clang -O2 -S foo.c: a. Ошибка компиляции с предупреждением формата.
  7. Необходимо добавить спецификатор формата '%ld' для вывода значения типа long.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.7 из 5